(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