(1)能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
(2)与Java动态编译相结合,可以实现无比强大的功能
缺点:
(1)使用反射的性能较低
(2)使用反射相对来说不安全
(3)破坏了类的封装性,可以通过反射获取这个类的私有方法和属性
以上先说明这个的优缺点 让我们下一步去理解下 JAVA中的反射
简单来说就是利用这一点反射我们可以动态的获取类自身的一个信息。在JAVA中,只要给类定义了名称,那么就可以通过反射机制去获取类
所有信息以及方法。灵活性特性就体现在这里。
说了那么多 其实针对性的题目来一题吧:
结果大家都很清楚了
a=1
b=2
x=5
y=7
那我们如何通过类的反射去写一个方法 拿到a b呐? 至于main方法中的x y变量 我不懂怎么获取。请看到的大神们指导下。谢谢
// 获取类的字节码文件对象
Class c = Class.forName("com.test.Reflect");
// 获取该类的所有成员变量 然后改变其值
Field[] f = c.getDeclaredFields();
for (Field fie : f) {
System.out.println(fie);
}
Field a = c.getDeclaredField("a");
a.set("a", 10);
这样的方法输入结果 你会发现 我们将a的值改变了。
其实其中还有很多方法 比如获取类中的构造方法
//获取类下的所有构造方法 那要如何取构造方法里边的值呐?
// Method[] methods = c.getMethods();
Method method = c.getDeclaredMethod("main", String[].class);
这样就能获取Main 的method
那我们看看一些Class中的常用常见的方法吧。
从Class中获取信息(可以查看Class的API文档了解):
获取类的构造器
首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象
public Constructor<?>[] getConstructors() 返回类中所有的public构造器集合,默认构造器的下标为0
public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合
public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回任意指定的构造器
获取类的成员变量
成员变量用Field类进行封装,主要的方法非常的类似:
public Field getDeclaredField(String name) 获取任意指定名字的成员
public Field[] getDeclaredFields() 获取所有的成员变量
public Field getField(String name) 获取任意public成员变量
public Field[] getFields() 获取所有的public成员变量
获取类的方法
public Method[] getMethods() 获取所有的共有方法的集合
public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合
public Method[] getDeclaredMethods() 获取所有的方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法
常用的就这些,知道这些,其他的都好办……
具体的案例的话这边也贴了一份最近参考的文献材料。具体的详细介绍说明可以去看看。
http://www.cnblogs.com/lijunamneg/archive/2013/03/25/2980991.html