Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说,是非常实用的功能。只需要短短的十几行代码,就可以遍历出来一个Java类的内部结构,包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类 的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructor、getField和getMethod。这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。Constructor、Field和Method这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。
反射API的另外一个作用是在运行时刻对一个Java对象进行操作。 这些操作包括动态创建一个Java类的对象,获取某个域的值以及调用某个方法。在Java源代码中编写的对类和对象的操作,都可以在运行时刻通过反射API来实现。
今天做了个小示例
package com.example; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Example { /** * @param args */ public static void main(String[] args) { try{ /* User user = new User(); user.setId(1001); user.setName("evil rogue studio"); user.setAge(25); */ Class<?> clazz = Class.forName("com.example.User"); //Class<?> clazz = new User().getClass(); Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println("方法:"+method); } Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println("字段:" + field); }
/**
* 执行带参数的构造函数来新建实例的方法
*/
//Constructor cons = clazz.getConstructor(parameterTypes);
//User user = (User) cons.newInstance(args);
User user = (User) clazz.newInstance(); Method method = clazz.getMethod("add",new Class<?>[]{int.class,int.class}); int result = (Integer)method.invoke(user, new Object[]{3,9}); System.out.println("add 结果:"+result); Method method2 = clazz.getDeclaredMethod("sub",new Class<?>[]{int.class,int.class}); method2.setAccessible(true); int result2 = (Integer)method2.invoke(user, new Object[]{13,9}); System.out.println("sub 结果:"+result2); }catch(Exception e){ e.printStackTrace(); } } }
package com.example; public class User { private long id; private String name; private int age; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * 加法 * * @param a * @param b * @return */ public int add(int a, int b) { return a + b; } /** * 减法 * * @param a * @param b * @return */ private int sub(int a, int b) { return a - b; } }