java中的反射机制浅析

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

                           

 

posted @ 2017-10-25 20:14  Wilange  阅读(406)  评论(0编辑  收藏  举报