什么是反射?
在Java中的反射机制是指在运行状态中,动态的获取任意一个类所有的属性和方法(包括方法签名和方法返回值等信息),并且任意一个对象都能够调用其任意一个方法。这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。
反射机制在什么情况中使用?
1、由于java多态的存在,使得对象运行时的类型和声明的类型不同,然而有些程序需要根据运行时的对象具体类型做出不同的处理,这时就需要用到反射机制了。例如在工厂模式中使用反射机制来创建子类。
2、反射最大的应用就是框架,可以用反射来动态填充属性。例如:
-spring和javaBean中对属性的填充
-JDBC 的 classForName()
反射机制如何使用?
1、java反射机制API
反射API用来生成JVM中的类、接口或则对象的信息。
-Class类:反射的核心类,可以获取类的属性,方法等信息。
-Field类:Java.lang.reflec包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
-Method类:Java.lang.reflec包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
-Constructor类: Java.lang.reflec包中的类,表示类的构造方法。
2、API使用
-获取类型
class clazz=Person.class;
class clazz=class.forName("Person");
class clazz=person1.getClass();
-获取类的属性和方法
Method[] method=clazz.getDeclaredMethods();
Field[] field=clazz.getDeclaredFields();
-调用对象的方法
//利用反射机制调用Person类的setName方法给对象person设置name为Amy
Person person=new Person();
Method method=Person.class.getMethod("setName",String.class);
method.invoke(person,"Amy");
3、java.beans包
java.beans包实现以其属性值的文本表示形式读取或写入 bean。这些属性值被视为 bean,它们被递归地读取或写入,以捕获其公共可用状态。【百度百科】
Java提供了java.beans .PropertyEditor接口以及java.beans .PropertyEditorSupport,后者实现了前者,自定义类在继承后者时只需要扩展setAsText(String)方法,即可将这个String按照自己的意愿解析成自定义的对象,生成对象后,调用setValue(Object)方法传入,就写到当前PropertyEditor对象的v就完成了对该Object的对应property(Feild)的赋值操作。
反射机制的优缺点?
尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。使用反射机制的原则:
性能第一
反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。
安全限制
使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题。
内部暴露
由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用——代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的功能也会随着变化。
参考:
【1】《java特种兵上》
【2】http://blog.csdn.net/u012721013/article/details/51833626
【3】http://blog.csdn.net/xu__cg/article/details/52882023