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();
        }
    }
}

代码解析

  1. 获取Class对象

    Class<?> clazz = Class.forName("ReflectionDemo$UserService");
    

    • 使用Class.forName()加载类,参数必须是完整类名(内部类需用$连接)
  2. 创建对象实例

    // 无参构造
    Object obj1 = clazz.getDeclaredConstructor().newInstance();
    
    // 有参构造
    Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
    Object obj2 = constructor.newInstance("张三");
    

  3. 调用方法

    // 无参方法调用
    Method showMethod = clazz.getMethod("showInfo");
    showMethod.invoke(obj);
    
    // 带参方法调用
    Method greetMethod = clazz.getMethod("greet", String.class);
    Object result = greetMethod.invoke(obj, "参数值");
    

执行结果

当前用户: 默认用户
当前用户: 张三
张三说: 你好,反射机制!

关键点说明

  1. 异常处理:所有反射操作都需要处理ClassNotFoundExceptionNoSuchMethodException等异常
  2. 方法签名匹配:获取方法时需要精确指定参数类型(String.class
  3. 内部类表示:内部类的完整类名格式为外部类名$内部类名
  4. 类型转换:方法返回值需要强制转换为实际类型(如(String)

应用场景:此技术广泛用于框架开发(如Spring的IoC容器)、动态代理、插件系统等需要运行时动态加载和操作类的场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐