Java反射机制:详解及实战应用示例
Java反射机制是Java语言中一个强大的特性,它允许程序在运行时访问、检查和修改它自己的结构,包括类、接口、字段和方法。以下是Java反射机制的详解和一些实战应用示例。
详解1. 类加载机制:
- Java程序运行时,JVM会加载字节码文件(.class文件)到内存中,创建一个
Class
对象。
-每个类在Java程序中只有一个Class
对象。
获取
Class
对象:
-通过类名直接调用.class
:MyClass.class
-通过实例调用getClass()
方法:myObject.getClass()
-通过完全限定类名调用Class.forName()
:Class.forName("com.example.MyClass")
访问类的结构:
- 获取类名:
className = clazz.getName()
- 获取类的修饰符:
modifiers = clazz.getModifiers()
- 获取类的字段(Field):
fields = clazz.getDeclaredFields()
- 获取类的方法(Method):
methods = clazz.getDeclaredMethods()
- 获取类的构造函数(Constructor):
constructors = clazz.getDeclaredConstructors()
创建对象:
-通过Class
对象的newInstance()
方法创建实例(Java9之前)。
-通过Constructor
对象的newInstance()
方法创建实例(推荐)。访问和修改字段:
- 获取字段值:
field.get(object)
- 设置字段值:
field.set(object, value)
调用方法:
-调用方法:method.invoke(object, args)
注意事项:
-反射会绕过编译时类型检查,因此可能会抛出IllegalArgumentException
或ClassCastException
。
-反射操作通常比直接代码调用慢,因为它涉及到类型解析和动态类型检查。
实战应用示例#### 示例1:动态创建对象```javaClass<?> clazz = Class.forName(“java.lang.String”);
Object obj = clazz.getDeclaredConstructor().newInstance();
System.out.println(obj instanceof String); // 输出:true#### 示例2:获取并修改字段
javapublic class Person {
private String name;
public Person() {
this.name = “Kimi”;
}
public static void main(String[] args) throws Exception {
Person person = new Person();
Class<?> clazz = person.getClass();
Field nameField = clazz.getDeclaredField(“name”);
nameField.setAccessible(true); //确保私有字段可以访问String name = (String) nameField.get(person);
System.out.println(name); // 输出:KiminameField.set(person, “Alice”);
System.out.println(person.name); // 输出:Alice }
}#### 示例3:调用方法
javapublic class Calculator {
public int add(int a, int b) {
return a + b;
}
}
public class ReflectionTest {
public static void main(String[] args) throws Exception {
Calculator calculator = new Calculator();
Class<?> clazz = calculator.getClass();
Method method = clazz.getMethod(“add”, int.class, int.class);
Integer result = (Integer) method.invoke(calculator,5,3);
System.out.println(result); // 输出:8 }
}
```这些示例展示了Java反射机制的基本用法。在实际开发中,反射机制可以用于框架开发、动态代理、依赖注入等高级应用。
还没有评论,来说两句吧...