获得Class对象的三种方式(来自java疯狂讲义)

来源:互联网 发布:2017正规淘宝刷単平台 编辑:程序博客网 时间:2024/05/07 02:01

(1)使用Class类的forName(String clazzName)静态方法,该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须加完整的包名)。

           代码如下:

import java.lang.reflect.*;public class CreateJFrame{public static void main(String[] args)throws Exception{// 获取JFrame对应的Class对象Class<?> jframeClazz = Class.forName("javax.swing.JFrame");Object object = jframeClazz.newInstance();// 获取JFrame中带一个字符串参数的构造器Constructor ctor = jframeClazz.getConstructor(String.class);// 调用Constructor的newInstance方法创建对象Object obj = ctor.newInstance("测试窗口");// 输出JFrame对象System.out.println(obj);}}


(2)调用某个类的class属性来获取该类对应的某个Class对象。

         代码如下:

       

import java.lang.reflect.*;import java.util.*;class Test{public void replace(String str, List<String> list){}}public class MethodParameterTest{public static void main(String[] args)throws Exception{// 获取String的类Class<Test> clazz = Test.class;// 获取String类的带两个参数的replace()方法Method replace = clazz.getMethod("replace", String.class, List.class);// 获取指定方法的参数个数System.out.println("replace方法参数个数:" + replace.getParameterCount());// 获取replace的所有参数信息Parameter[] parameters = replace.getParameters();int index = 1;// 遍历所有参数for (Parameter p : parameters){if (p.isNamePresent()){System.out.println("---第" + index++ + "个参数信息---");System.out.println("参数名:" + p.getName());System.out.println("形参类型:" + p.getType());System.out.println("泛型类型:" + p.getParameterizedType());}}}}
(3)调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以,所有的java对象都可以调用这个方法,该方法将会返回该对象所属类对应的Class对象。

代码如下:

import java.util.*;import java.io.*;import java.lang.reflect.*;public class ExtendedObjectPoolFactory{// 定义一个对象池,前面是对象名,后面是实际对象private Map<String ,Object> objectPool = new HashMap<>();private Properties config = new Properties();// 从指定属性文件中初始化Properties对象public void init(String fileName){try(FileInputStream fis = new FileInputStream(fileName)){config.load(fis);}catch (IOException ex){System.out.println("读取" + fileName + "异常");}}// 定义一个创建对象的方法,// 该方法只要传入一个字符串类名,程序可以根据该类名生成Java对象private Object createObject(String clazzName)throws InstantiationException, IllegalAccessException , ClassNotFoundException{// 根据字符串来获取对应的Class对象Class<?> clazz =Class.forName(clazzName);// 使用clazz对应类的默认构造器创建实例return clazz.newInstance();}// 该方法根据指定文件来初始化对象池,// 它会根据配置文件来创建对象public void initPool()throws InstantiationException,IllegalAccessException , ClassNotFoundException{for (String name : config.stringPropertyNames()){// 每取出一对key-value对,如果key中不包含百分号(%)// 这就标明是根据value来创建一个对象// 调用createObject创建对象,并将对象添加到对象池中if (!name.contains("%")){objectPool.put(name ,createObject(config.getProperty(name)));}}}// 该方法将会根据属性文件来调用指定对象的setter方法public void initProperty()throws InvocationTargetException,IllegalAccessException,NoSuchMethodException{for (String name : config.stringPropertyNames()){// 每取出一对key-value对,如果key中包含百分号(%)// 即可认为该key用于控制调用对象的setter方法设置值,// %前半为对象名字,后半控制setter方法名if (name.contains("%")){// 将配置文件中key按%分割String[] objAndProp = name.split("%");// 取出调用setter方法的参数值Object target = getObject(objAndProp[0]);// 获取setter方法名:set + "首字母大写" + 剩下部分String mtdName = "set" +objAndProp[1].substring(0 , 1).toUpperCase()+ objAndProp[1].substring(1);// 通过target的getClass()获取它实现类所对应的Class对象Class<?> targetClass = target.getClass();// 获取希望调用的setter方法Method mtd = targetClass.getMethod(mtdName , String.class);// 通过Method的invoke方法执行setter方法,// 将config.getProperty(name)的值作为调用setter的方法的参数mtd.invoke(target , config.getProperty(name));}}}public Object getObject(String name){// 从objectPool中取出指定name对应的对象。return objectPool.get(name);}public static void main(String[] args)throws Exception{ExtendedObjectPoolFactory epf = new ExtendedObjectPoolFactory();epf.init("extObj.txt");epf.initPool();epf.initProperty();System.out.println(epf.getObject("a"));}}



extObj.txt文件的内容:
a=javax.swing.JFrame
b=javax.swing.JLabel
#set the title of a
a%title=Test Title


0 0
原创粉丝点击