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

反射是指在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内存中,在堆内存中创建一个对象。
反射就是:知道一个对象,反过来去获取的它的各种信息。

发布了16 篇原创文章 · 获赞 1 · 访问量 286

猜你喜欢

转载自blog.csdn.net/lovesman/article/details/103325529
今日推荐