好久都没有回顾java反射了,在实际编程中很少会直接使用反射去实现某些功能,但是我们常用的开发框架里面都有反射技术,可以说反射技术是无处不在!!
一,先看一下反射的概念:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
看概念很晕的,继续往下看。
二,反射机制的作用:
1,反编译:.class-->.java
2,通过反射机制访问java对象的属性,方法,构造方法等;
这样好像更容易理解一些,下边我们具体看怎么实现这些功能。
三,在这里先看一下sun为我们提供了那些反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询 API .准备工作:
新建一个类Tes2.class:
public class Test2 {
private String name="LOVE";
@Override
public String toString() {
return "hello world";
}
private String getName(){
return this.name;
}
private void setName(String name){
this.name=name;
}
private Test2(){}
}
看文字都觉得没趣,我们直接上代码(不了解调用方法的话请结合java API理解):
1.加载一个类(这是非常非常常用的:如加载数据库驱动...)
Class aClass = Class.forName("com.my.Test2");
2.获取此类的所有字段属性
Field[] fields = aClass.getDeclaredFields();
此处反回的是一个数组:
3.查看此类的超类
AnnotatedType superclass = aClass.getAnnotatedSuperclass();
4.查看此类及其超类中所有的public属性方法
//返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口
// (包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
Method[] methods = aClass.getMethods();
也可以制定方法名获取:
Method m = aClass.getMethod("getName");
5.获取此类及其所有超类的所有方法(包括private属性方法)
Method[] declaredMethods = aClass.getDeclaredMethods();
Method getName = aClass.getDeclaredMethod("getName");
6.方法调用
Test2 t = new Test2();//新建一个对t象
//调用公共方法
Method toString = aClass.getMethod("toString");
Object ret = toString.invoke(t);
//掉用私有方法(无参数)
Method getName = aClass.getDeclaredMethod("getName");
getName.setAccessible(true);
Object re = getName.invoke(t);
//掉用私有方法(有参数)
Method setName = aClass.getDeclaredMethod("setName",String.class);
setName.setAccessible(true);
setName.invoke(t,"java反射");
Object re2 = getName.invoke(t);
7.通过java反射拿到类私有的构造方法实例化对象
Constructor[] constructors = aClass.getDeclaredConstructors();
constructors[0].setAccessable(true);
Test2 t = (Test2)constructors[0].newInstance();
此处只简要介绍了java反射的方法调用,还可以通过java api 访问得到更多的类信息.
综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。