温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样通过反射创建对象

发布时间:2026-09-14 03:18:24 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 中,反射(Reflection)可以在运行时动态地获取类的信息并创建对象。下面从基本用法到常见方式系统说明。


一、通过反射创建对象的常见方式

✅ 方式一:Class.newInstance()(已过时)

⚠️ Java 9 之后已废弃,不推荐使用

Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.newInstance(); // 调用无参构造

✅ 方式二:通过 Constructor(推荐 ✅)

1️⃣ 调用无参构造

Class<?> clazz = Class.forName("com.example.User");
Constructor<?> constructor = clazz.getDeclaredConstructor();
Object obj = constructor.newInstance();

2️⃣ 调用有参构造

Class<?> clazz = Class.forName("com.example.User");
Constructor<?> constructor =
        clazz.getDeclaredConstructor(String.class, int.class);

Object obj = constructor.newInstance("Tom", 18);

✅ 方式三:调用私有构造方法

Constructor<?> constructor =
        clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true); // 突破访问限制
Object obj = constructor.newInstance("private");

二、获取 Class 对象的三种方式

// 1. 类名.class
Class<User> c1 = User.class;

// 2. 对象.getClass()
User user = new User();
Class<?> c2 = user.getClass();

// 3. Class.forName(最常用)
Class<?> c3 = Class.forName("com.example.User");

三、完整示例

public class User {
    private String name;
    private int age;

    public User() {}

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("User");

        Constructor<?> c =
            clazz.getDeclaredConstructor(String.class, int.class);

        Object user = c.newInstance("Alice", 20);

        System.out.println(user);
    }
}

四、注意事项(非常重要)

  1. 必须有无参构造(如果不指定构造器)
  2. 构造方法如果是 private,需 setAccessible(true)
  3. 反射会破坏封装性
  4. 反射性能比 new 慢(一般业务不频繁使用)
  5. 框架(Spring、MyBatis)大量使用反射

五、常见使用场景

  • 框架底层(Spring IOC)
  • 动态代理
  • 注解处理
  • 通用工具类
  • 配置文件驱动对象创建

如果你愿意,我也可以:

  • 用 Spring 源码角度讲反射
  • 讲 反射 + 注解实战
  • 对比 new vs 反射性能

你想深入哪一块?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手