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内存中,在堆内存中创建一个对象。
反射就是:知道一个对象,反过来去获取的它的各种信息。
下一篇: exit()与_exit()函数的区别