反射的概述
反射可以通过reflectionAPI获取任何类的内部信息,并且能操作对象的属性和方法。 在jvm的加载阶段,class文件加载完成后会在堆中生成对应的Class对象,该对象有类的完整结构信息。反射就是通过这个对象来获取类的内部信息的。这个过程就像是照镜子一样,所以被称为反射。
基本使用
java反射的基本类
要先获取Class对象才能获取后续的内容。
使用
我的感觉是先获取Class的对象,再通过这个对象获取方法、属性等类的内部信息,还可以创建该类的对象。
之后要给属性赋值,就要指定是哪个对象,除非该属性是static修饰的属性。一般无法使用类的private变量,但可以使用xxdecalaredXXXX方法获取,还要使用SetAccessable(true)进行爆破操作,这样就能使用私有属性和方法了。
简单的例子
public class A {
public static void main(String[] args) throws Exception {
//获取类的对象
Class<?> aClass = Class.forName("refle.B");
System.out.println(aClass);
System.out.println(aClass.getClass());
Object o = aClass.newInstance();
//获取构造器
Constructor<?> constructor = aClass.getConstructor();
Object o1 = constructor.newInstance();
System.out.println(o1);
//可以获取所有构造器,通过指定参数获得想要的构造器
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class,int.class);
//暴破
declaredConstructor.setAccessible(true);
Object o2 = declaredConstructor.newInstance("默认2",100);
System.out.println(o2);
}
}
class B{
public String name;
private int age;
public B(){
this.name = "默认";
this.age =1;
}
private B(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString(){
return "name= "+ name +" "+ "age=" + age;
}
}