欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java基础-反射的原理和机制

程序员文章站 2024-01-21 20:31:10
...

反射是指在java程序运行过程中可以获取任意一个类的属性和方法,可以调用任意对象的属性和方法,这就是java发射机制。

一、获取Class的方法:
1⃣️Class.forName(“类的全限定名称”)
2⃣️类.class
3⃣️对象.getClass()

二、通过反射来生成对象的两种方法:
1⃣️

Class<?> c = String.class;
    String str = c.newInstance();

2⃣️
先获取指定Class,然后获取其构造函数,然后通过构造器创建具体的对象。

 public static void main(String[] args) throws IllegalAccessException, InstantiationException {
 		//	获取指定的Class
        Class c = String.class;

        //获取所有的"public"构造函数
        Constructor[] constructors = c.getConstructors();

        for (int i = 0; i < constructors.length; i++) {
            System.out.println("=====" + constructors[i]);
        }
        //获取所有类型的构造函数
        Constructor[] constructors1 = c.getDeclaredConstructors();
        for (int i = 0; i < constructors1.length; i++) {
            System.out.println(constructors1[i]);
        }
    }

在getConstructors方法中传入参数类型,即可获取指定参数类型的构造函数。

//获取指定参数类型的构造函数
        Constructor constructor2 = c.getConstructor(StringBuilder.class);
        
        //根据指定的构造函数创建对象
        String str = (String)constructor2.newInstance(new StringBuilder());

三、获取成员方法和属性
讲过了获取构造函数,那么反射机制的过程中,能够获取类的属性和方法,然后动态创建尼?

获取成员方法与获取构造器函数用法一致,知识调用的方法不同而已。

Method[] methods = c.getMethods();
        for (int i = 0; i < methods.length; i++) {
            System.out.println(methods[i]);
        }

Method[] methods1 = c.getDeclaredMethods();
for (int i = 0; i <methods1.length ; i++) {
System.out.println(methods1[i]);
}

那函数中的属性又是什么情况呢?
话不多说,直接看代码。

Field[] fields = c.getFields();
        for (int i = 0; i <fields.length ; i++) {
            System.out.println(fields[i]);
        }
        
        Field[] fields1 = c.getDeclaredFields();

一样的用法,可以这么说;只要获取到了Class,那么获取构造函数、成员方法和属性的方法基本是一样的。

四、其他用法
1⃣️通过将类名和一些初始化参数写在配置文件里面,我们可以做到只修改配置文件,不用修改代码,就可以修改实现的类。

2⃣️因为反射是运行过程中获取或者调用类的属性和方法,所以可以跳过泛型检查这个步骤(编译之后,泛型就被擦除了),这样同时也提高了代码报错的风险。

讲了这么多,现在来总结一下:
反射是类加载的反向过程。
类加载的过程:当我们初始化一个类时,jvm会去硬盘上查找.class文件,并加载到jvm内存中,在堆内存中创建一个对象。
反射就是:知道一个对象,反过来去获取的它的各种信息。