Java的反射机制是指在程序运行时能够动态地获取类、方法、字段等信息,甚至可以在运行时创建对象、调用方法和访问属性。反射使得程序在编译时不需要了解具体的类信息,而可以在运行时进行操作,提供了更大的灵活性和动态性。比如:通过配置 properties 文件结合反射机制,可以实现动态修改配置而无需改变源代码。这样的设计模式在实际开发中非常常见,比如用来配置数据库连接信息、应用程序的运行参数等。反射机制可以通过读取配置文件,动态加载类、设置属性或调用方法,从而实现灵活的配置和行为控制。
如何获取Class对象?
- 第一种获取类的方式:通过
Class.forName("类的全限定名")来获取类的Class对象,注意需要正确提供完整的类名,否则会抛出ClassNotFoundException。最常用的一种。

- 第二种方式是通过对象的
getClass()方法来获取该对象的Class实例。当我们已经有了该类的对象再使用。 - 第三种方式是通过基本数据类型或引用类型直接使用
.class属性来获取类的信息。一般更多的当做参数进行传递。
如何通过反射机制获取类的Class对象,并验证获取到的Class对象是否相等?
public class ReflectTest01 {
public static void main(String[] args) throws ClassNotFoundException {
// stringClass 代表着 String 类型。
// stringClass 就代表硬盘上的 String.class 文件。
Class stringClass = Class.forName("java.lang.String");
String s1 = "动力节点";
Class stringClass2 = s1.getClass();
// 某种类型的字节码文件在内存当中只有一份。
// stringClass 和 stringClass2 都代表了一种类型:String 类型
System.out.println(stringClass == stringClass2); // true
// 获取 User 类型
Class userClass = Class.forName("com.powernode.javase.reflect.User");//类的全限定名
User user = new User("zhangsan", 20);
Class userClass2 = user.getClass();
System.out.println(userClass2 == userClass); // true
// intClass 代表的就是基本数据类型 int 类型
Class intClass = int.class;
Class doubleClass = double.class;
}
}
利用反射获取构造方法

package Constructor;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
public class demo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class clazz = Class.forName("Constructor.Student");
// 获取构造方法
// 获取public的构造方法
Constructor[] cons = clazz.getConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
System.out.println("-----------------获取所有参数--------------------");
// 获取所有参数
Constructor[] all = clazz.getDeclaredConstructors();
for (Constructor c : all) {
System.out.println(c);
}
// 获取单个构造方法
// ()当中的参数要和需要获取的构造函数的参数保持一致
Constructor con1 = clazz.getDeclaredConstructor();
System.out.println("默认的构造方法:"+ con1);
Constructor con2 = clazz.getDeclaredConstructor(String.class);
System.out.println("获取通过名字创造对象的构造方法:"+con2);
Constructor con3 = clazz.getDeclaredConstructor(String.class,int.class);
System.out.println("获取通过名字和年龄创造对象的构造方法:"+con3);
// 获取构造方法的权限修饰符
// 返回值是整数 public - 1,private - 2 ,protected - 4
// 是2的次方
int modifiers = con2.getModifiers();
System.out.println(modifiers);
// 获取con2的构造方法所有的参数
Parameter[] parameters = con2.getParameters();
for (Parameter p : parameters) {
System.out.println(p);
}
// 通过构造方法实例化对象
Student o = (Student) con3.newInstance("zhangsan", 24);
System.out.println(o);
// 如果构造方法是私有的,我们还需要临时取消权限的校验
con2.setAccessible(true);
Student o1 = (Student)con2.newInstance("wangwu");
System.out.println(o1);
}
}
通过反射机制获取类的成员变量(字段)

import java.lang.reflect.Field;
// 获取对象的成员变量
public class demo2 {
public stat
Java反射机制的原理与应用

最低0.47元/天 解锁文章
975





