java 反射

82 阅读1分钟

反射的概述

反射可以通过reflectionAPI获取任何类的内部信息,并且能操作对象的属性和方法。 在jvm的加载阶段,class文件加载完成后会在堆中生成对应的Class对象,该对象有类的完整结构信息。反射就是通过这个对象来获取类的内部信息的。这个过程就像是照镜子一样,所以被称为反射。

基本使用

java反射的基本类

image.png 要先获取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;
 }
}