从 0 学 Java(22):反射实战案例:动态创建对象并调用方法的完整代码
·
Java反射实战:动态创建对象并调用方法
下面是一个完整的反射案例,通过类名字符串动态创建对象并调用其方法。代码包含详细注释,适合初学者理解反射机制的核心步骤。
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectionDemo {
// 目标类:将被动态创建和调用的类
static class UserService {
private String userName;
public UserService() {
this.userName = "默认用户";
}
public UserService(String userName) {
this.userName = userName;
}
public void showInfo() {
System.out.println("当前用户: " + userName);
}
public String greet(String message) {
return userName + "说: " + message;
}
}
public static void main(String[] args) {
try {
// 1. 通过完整类名获取Class对象
Class<?> clazz = Class.forName("ReflectionDemo$UserService");
// 2. 动态创建对象(两种方式)
// 方式1:使用无参构造器
Object obj1 = clazz.getDeclaredConstructor().newInstance();
// 方式2:使用有参构造器
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
Object obj2 = constructor.newInstance("张三");
// 3. 动态调用无参方法
Method showMethod = clazz.getMethod("showInfo");
showMethod.invoke(obj1); // 调用默认用户实例
showMethod.invoke(obj2); // 调用张三实例
// 4. 动态调用带参方法
Method greetMethod = clazz.getMethod("greet", String.class);
String result = (String) greetMethod.invoke(obj2, "你好,反射机制!");
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码解析
-
获取Class对象
Class<?> clazz = Class.forName("ReflectionDemo$UserService");- 使用
Class.forName()加载类,参数必须是完整类名(内部类需用$连接)
- 使用
-
创建对象实例
// 无参构造 Object obj1 = clazz.getDeclaredConstructor().newInstance(); // 有参构造 Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); Object obj2 = constructor.newInstance("张三"); -
调用方法
// 无参方法调用 Method showMethod = clazz.getMethod("showInfo"); showMethod.invoke(obj); // 带参方法调用 Method greetMethod = clazz.getMethod("greet", String.class); Object result = greetMethod.invoke(obj, "参数值");
执行结果
当前用户: 默认用户
当前用户: 张三
张三说: 你好,反射机制!
关键点说明
- 异常处理:所有反射操作都需要处理
ClassNotFoundException、NoSuchMethodException等异常 - 方法签名匹配:获取方法时需要精确指定参数类型(
String.class) - 内部类表示:内部类的完整类名格式为
外部类名$内部类名 - 类型转换:方法返回值需要强制转换为实际类型(如
(String))
应用场景:此技术广泛用于框架开发(如Spring的IoC容器)、动态代理、插件系统等需要运行时动态加载和操作类的场景。
更多推荐



所有评论(0)