反射
- 反射机制即指java可以在运行期间通过Class的Class Class.forName(String)方法动态地加载一个类
- 继而可以通过获得的该类对应的的Class对象的Object newInstance()方法实例化出该类的对象
- 然后可以通过Method[] getMethods() 和Field[] getFields()等方法了解类的内部结构
- 最后就可以根据方法的内部结构决定该方法应该怎么样去调用,从而动态地去调用类的方法m.invoke(Object,
Object... args
)
反射的例子:TestReflection.java
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TestRefection { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { String str = "T"; Class c = Class.forName(str); p("-----------"); Object o = c.newInstance(); Method[] ms = c.getMethods(); for (Method m : ms) { // p(m.getName()); if (m.getName().equals("mm")) { m.invoke(o, null); } if (m.getName().equals("m1")) { m.invoke(o, 1, 2); for (Class paramType : m.getParameterTypes()) { p(paramType.getName()); } } if (m.getName().equals("getS")) { Class returnType = m.getReturnType(); p(returnType.getName()); } } } public static void p(Object o) { System.out.println(o); } } class T { static { System.out.println("T loaded!"); } int i; String s; public T() { System.out.println("T constructed!"); } public void mm() { System.out.println("mm invoked!"); } public void m1(int i, int j) { this.i = i + j; } public String getS() { return s; } }输出 :
T loaded! ----------- T constructed! mm invoked! int int java.lang.String反射机制的好处在于可以使程序的可扩展性变的非常好;例如可以在配置文件里配置类名,然后在程序中动态的加载加载配置文件中指定的类并调用其方法,调方法之前还可以先检查这个人有没有这个权限,在Spring Hibernate transaction的处理以及面向切面的编程AOP中都大量用到了反射机制