上面的多个getMethod()方法和getConstructor()方法中,都需要传入多个类型为Class<?>的参数,用于获取指定的方法或指定的构造器。关于这个参数的作用,假设某个类内包含如下3个info方法签名:
public void info()
public void info(String str)
public void info(String str , Integer num)
这3个同名方法属于重载,它们的方法名相同,但参数列表不同。在Java语言中要确定一个方法光有方法名是不行的,例如,我们指定info方法——实际上可以是上面3个方法中的任意一个!如果需要确定一个方法,则应该由方法名和形参列表来确定,但形参名没有任何实际意义,所以只能由形参类型来确定。例如,我们想要确定第二个info方法,则必须指定方法名为info,形参列表为String.class——因此在程序中获取该方法使用如下代码:
clazz.getMethod("info",String.class); 使用反射生成对象利用构造函数生成对象
使用Class对象的newInstance()方法来创建该Class对象对应类的实例,这种方式要求该Class对象的对应类有默认构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。
先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用指定的构造器来创建实例。
Constructor c = clazz.getConstructor(String.class); c.newInstance("xx"); 调用方法 Method setProName = aClass.getDeclaredMethod("setProName",String.class); setProName.setAccessible(true); etProName.invoke(product,"我是一个产品"); 操作属性 Field[] declaredFields = aClass.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println("fieldName:"+declaredField.getName()+" filedType:"+declaredField.getType()); } Field proName = aClass.getDeclaredField("proName"); proName.setAccessible(true); proName.set(product,"我是一个产品"); System.out.println("修稿属性:"+product); 操作数组 //使用反射动态地创建数组 //创建一个元素类型为String,长度为3的数组 Object arr = Array.newInstance(String.class, 3); //依次为arr数组中index为0,1,2的元素赋值 Array.set(arr, 0, "荣耀盒子"); Array.set(arr, 1, "荣耀8手机"); Array.set(arr, 2, "华为mate9保时捷版"); Object o1= Array.get(arr, 0); Object o2= Array.get(arr, 1); Object o3= Array.get(arr, 2); System.out.println(o1); System.out.println(o2); System.out.println(o3); 5. 使用Demo public class ReflectDemo { public static void main(String[] args) throws Exception { Class<Product> aClass = Product.class; Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors(); for (Constructor<?> declaredConstructor : declaredConstructors) { System.out.println(declaredConstructor.getName()); } Constructor<Product> constructor = aClass.getConstructor(int.class, String.class); Product product = constructor.newInstance(10, "ds"); System.out.println("创建对象:"+product); //获取方法并调用 Method setProName = aClass.getDeclaredMethod("setProName", String.class); setProName.setAccessible(true); setProName.invoke(product,"我是一个产品"); System.out.println("调用方法:"+product); //获取属性,并设置属性的值 Field[] declaredFields = aClass.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println("fieldName:"+declaredField.getName()+" filedType:"+declaredField.getType()); } Field proName = aClass.getDeclaredField("proName"); proName.setAccessible(true); proName.set(product,"我是一个产品"); System.out.println("修稿属性:"+product); //使用反射动态地创建数组 //创建一个元素类型为String,长度为3的数组 Object arr = Array.newInstance(String.class, 3); //依次为arr数组中index为0,1,2的元素赋值 Array.set(arr, 0, "荣耀盒子"); Array.set(arr, 1, "荣耀8手机"); Array.set(arr, 2, "华为mate9保时捷版"); Object o1= Array.get(arr, 0); Object o2= Array.get(arr, 1); Object o3= Array.get(arr, 2); System.out.println(o1); System.out.println(o2); System.out.println(o3); System.out.println("end..."); } }