目录
Java作为一门强类型语言,其静态性和类型安全性一直是其优势之一。然而,在某些情况下,我们可能需要在运行时获取、操作类的信息,这时Java的反射机制就发挥了重要的作用。反射机制允许我们在运行时检查类、获取类的信息,并在运行时动态创建对象、调用方法、访问字段,这为编写灵活且可扩展的代码提供了可能。
在学习java反射机制的时候可以也了解一下java类是怎么加载的:java类加载机制
通过反射机制,我们可以在运行时动态加载类,这为实现插件化、动态配置等场景提供了可能。
(1)
Class.forName("类的全路径名");
(2)
类名.class?
(3)
类的实例.getClass()?
注意:class 对象只有一个,三种方式得到的类是一个。?
利用反射,我们可以在运行时动态地实例化类的对象,而无需在编译时知道具体的类名。
类对象.newInstance()
try {
Class<?> myClass = Class.forName("com.example.MyClass");
Object instance = myClass.newInstance();
System.out.println("Object instantiated: " + instance);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
注意:类对象前大概率是需要强制类型转换的(根据你自己的类进行转换),这里直接用的 Object。
反射机制允许我们在运行时检查和操作类的字段。下面的例子演示了如何获取和设置类的字段值:
类对象.getDeclaredField("name")
try {
Class<?> myClass = Class.forName("com.example.MyClass");
Object instance = myClass.newInstance();
// 获取属性
Field myField = myClass.getDeclaredField("myField");
// 设置属性值
myField.setAccessible(true);
myField.set(instance, "New Value");
// 获取属性值
Object value = myField.get(instance);
System.out.println("Field value: " + value);
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
通过反射,我们可以在运行时调用类的方法。
类对象.getDeclaredMethod("myMethod");
try {
Class<?> myClass = Class.forName("com.example.MyClass");
Object instance = myClass.newInstance();
// 获取方法
Method myMethod = myClass.getDeclaredMethod("myMethod");
// 调用方法
myMethod.setAccessible(true);
myMethod.invoke(instance);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}