1.反射机制的理解
- 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
- 对于任意一个对象,都能够调用它的任意一个方法和属性
- 类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字
2.反射机制的作用
- 在运行时判断任意一个对象所属的类;
- 在运行时获取类的实例对象;
- 在运行时访问对象的属性,方法,构造方法等;
- 结合工厂模式实现了Spring中的IoC。
3.反射机制的应用背景
反射机制实现了动态创建对象和编译,体现出很大的灵活性。对于一个大型的软件来说,不可能一次就把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。
4.反射机制的示例
先创建一个Person类,包括成员属性、成员方法。
1 public class Person { 2 3 public String name; 4 5 public void run() { 6 System.out.println("This person is running!"); 7 } 8 9 }
通过反射机制获取Person类的信息,并且访问和调用成员属性和成员方法。
1 import java.lang.reflect.Field; 2 import java.lang.reflect.InvocationTargetException; 3 import java.lang.reflect.Method; 4 5 /* 6 * java中的反射机制解析: 7 * 1.通过反射机制,可以在程序运行时获取类的信息 8 * 方法:通过类名.class得到 9 * 通过Object的getClass()方法得到,适用于不知道类型的情况 10 * 通过全类名获取,用的比较多 11 * 2.通过反射机制创建实例对象、获取成员方法、调用成员方法、获取成员属性、设置属性 12 * 注意:反射机制 + 工厂模式 = Spring中的IoC 13 */ 14 public class ReflectTest { 15 16 public static void main(String[] args) 17 throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, 18 InvocationTargetException, NoSuchFieldException, InstantiationException, IllegalAccessException { 19 Class clazz = null; 20 21 // 通过类名.class得到 22 clazz = Person.class; 23 System.out.println("通过类名得到:" + clazz); 24 25 // 通过Object的getClass()方法得到,适用于不知道类型的情况 26 Object obj = new Person(); 27 clazz = obj.getClass(); 28 System.out.println("通过getClass方法得到:" + clazz); 29 30 // 通过全类名获取,用的比较多,但是会抛出ClassNotFoundException异常 31 clazz = Class.forName("codeAnal.Person"); 32 System.out.println("通过全类名获取:" + clazz); 33 34 /* 35 * 创建实例化对象、获取方法、调用方法、获取属性、设置属性 36 * 注意此处需要抛出异常 37 */ 38 // 获取实例化对象 39 Object object = clazz.newInstance(); 40 System.out.println("实例对象" + object); 41 // 获取类中的方法 42 Method method = clazz.getDeclaredMethod("run"); 43 System.out.println("方法:" + method); 44 // 调用类中的方法 45 method.invoke(object); 46 // 获取属性 47 Field field = clazz.getDeclaredField("name"); 48 // 设置属性 49 field.setAccessible(true); 50 field.set(object, "张三"); 51 System.out.println("人名:" + field.get(object)); 52 53 } 54 }
本文只是简单介绍了一下Java中的反射机制,详细了解请参考:http://www.cnblogs.com/Eason-S/p/5851078.html