名词概念的理解
反射是一种相对的状态或者行为;
就是对 自身的把控,跟操控对方一样,我来控制自己;
大赛临近的时候,刘翔不是经常说么“没有对手,最大的对手就是自己”,这就是反射。
主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
i.JAVA 反射机制是在 运行状态中,对于任意一个类,都能够知道这个类的所有属性和方
法;对于任意一个对象,都能够调用它的任意一个方法;这种 动态获取的信息以及动态调用
对象的方法的功能称为java 语言的反射机制。所以说,Reflection 是Java 被视为 动态(或准动态)语言的一个关键性质。
ii.这个机制允许程序在运行时透过Reflection APIs 取得任何一个已知名称的class 的内部信息,
包括其modifiers(诸如public, static 等等)、
superclass(例如Object)、
实现之interfaces(例如Cloneable ),
也包括fields 和methods 的所有信息,并可于运行时改变fields 内容或唤起methods
iii.功能
Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造
任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意
一个对象的方法;生成动态代理。
性能问题
反射是基本的解释性操作,就是你告诉JVM 你要做什么,它就会为你做什么。比直接的代码访问要慢很多。
复杂度高
跟直接编码相比反射技术会使代码内部逻辑变得模糊不清,不便于维护。所以,尽可能少使用反射,只有在一些增加灵活性的地方来使用它。
所在的包
java.lang.relfect;
Java 的类反射所需要的类并不多,它们分别是:Object、Class、Constructor、Field、Method
i.第一步是获得你想操作的类的java.lang.Class 对象,eg. Class c = Class.forName("java.lang.String");
ii.第二步是调用诸如getDeclaredMethods 的方法,eg.
iii.一旦取得这个信息,就可以进行第三步了——使用reflection API 来操作这些信息,如下面
这段代码:
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
由于反射重在思想和底层实现,我们实际应用层基本不会让你去编码的,所以这里不在代码上深入追究了。万一要是用到了看下API 就搞定了。就上面提到的几个类,每个类四个方法。