目录
什么是反射?
反射如何获取类信息?
小结:
什么是反射?
反射是用代码分析类信息的能力
类中有哪些信息:方法、对象、构造器、全局变量、父类、接口等....
反射如何获取类信息?
三种方式
1.通过对象的getClass方法进行获取
2.通过Class.forName()方法获取
3.通过静态属性class可直接获取到该类型对应的Class对象 例如:T.class 将代表匹配的类对象
面试题:反射能不能通过反射访问类的私有信息?
可以 将下面代码设置成true
这种方式为暴力反射,写个demo演示一下
获取全局变量信息的方式 Filed:
public class Reflection {
private String name;
@Override
public String toString() {
return "reflection{" +
"name='" + name + '\'' +
'}';
}
}
class violence{
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Reflection reflection = new Reflection();
Field name = Reflection.class.getDeclaredField("name");
name.set(reflection,"小黑子");
System.out.println(reflection);
}
}
name.setAccessible(true); 不加这行代码时运行结果:
报错显示 无法直接访问private修饰的私有成员name属性
Exception in thread "main" java.lang.IllegalAccessException:
Class com.qcby.test.demo.violence can not access a member of class
com.qcby.test.demo.Reflection with modifiers "private"
添加后:就能够访问name属性了
小结:
反射获取类的全局变量
1. 类对象.getDeclaredFields() 获取所有的全局变量 需要使用Filed[]接收
2. 类对象.getFields() 获取所有的public修饰的全局变量 需要使用Filed[]接收
3. 类对象.getDeclaredField(“变量名”) 能够获取指定的任何修饰符修饰的全局变量信息 需要使用Filed接收
4. 类对象.getField(“变量名”) 能够获取指定的public修饰符修饰的全局变量信息 需要使用Filed接收
返回获取方法 Method:
public class Reflection {
private String name;
private void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "reflection{" +
"name='" + name + '\'' +
'}';
}
}
class violence{
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Reflection reflection = new Reflection();
// Field name = Reflection.class.getDeclaredField("name");
// name.setAccessible(true);
// name.set(reflection,"小黑子");
Method setName = Reflection.class.getDeclaredMethod("setName", String.class);
setName.setAccessible(true);
setName.invoke(reflection,"cxk");
System.out.println(reflection);
}
}
小结:
获取类的方法的方式
1. 类对象.getDeclaredMethods() : 这种方式 获取所有的 方法信息 Method[]
2. 类对象.getMethods() : 这种方式 获取public修饰的 方法信息 Method[]
3. 类对象.getDeclaredMethod("方法名",所有参数的类型) 获取所有的指定的方法信息 Method
4. 类对象.getMethod("方法名",所有参数的类型) 获取public的指定的方法信息 Method
以上是个人对反射学习后的总结,希望对你有帮助,不足请补充!