什么是反射
反射是java提供的动态检查机制,动态的检查对象和类,分析出对象的类型,属性和方法。可以进一步动态加载类,动态创建对象,动态访问属性和方法。
反射的作用
- 反射最大一个功能是提供了强大的动态执行功能。
- 反射经常用于处理程序直接的耦合关系,实现松耦合。组件和组件之间是动态链接调用的,也就是运行期动态加载,动态调用。
- 反射常用于解耦。
经典面试题
1.Eclipse中动态的快捷菜单利用什么技术实现的?
答:利用反射技术动态获取类信息,加载到菜单中。
2.java中可以访问私有方法吗?
答:一般情况是不能直接访问的,但是使用发射API就行。
使用方法:
method.setAccessible(true);
使用方法
1.利用反射检查对象的类型
//返回结果cls代表对象的类型
class cls=obj.getClass();
2.动态加载类到方法区
class cls=class.forName(className);
3.动态获取一个类的所有属性信息(不是属性的值)
File[] fields=cls.getDeclaredFields();
4.动态查找类中声明的方法信息
Method[] methods=cls.getDeclaredMethods();
5.将私有方法设为可访问的
method.setAccessible(true);
6.动态执行一个方法
//val是方法的返回值
Object val=method.invoke(obj);
//动态获取对象中全部方法
Method[] methods=cls.getDeclaredMethods();
for(Method method:methods){
//获取方法的名称
String name=method.getName();
if(name.startsWith("test"){
//将私有方法设为可访问的
method.setAccessible(true);
//动态执行一个方法
Object val=method.invoke(obj);
}
}
//name为属性名称
Field field=cls.getDeclaredField(name);
//获取属性的类型,java中类型用class表示
Class type=field.getType();
//判断所有类型
if(type==int.class){
...
}else if(type==double.class){
...
}
//动态获取obj对象的属性field的值
Object val=field.get(obj)