【java】Class.newInstance()

在 Java 中,Class.newInstance()是一个用于创建类的新实例的方法。它调用类的无参构造函数来创建对象。然而,从 Java 9 开始,Class.newInstance()方法已经被标记为废弃,推荐使用其他替代方法。

Class.newInstance()的使用
Class.newInstance()方法会调用类的无参构造函数来创建对象。如果类没有无参构造函数,或者无参构造函数不可访问,会抛出异常。

示例代码

public class MyClass {
    public MyClass() {
        System.out.println("Constructor called");
    }

    public static void main(String[] args) throws Exception {
        // 使用 Class.newInstance() 创建对象
        MyClass instance = MyClass.class.newInstance();
        System.out.println("Instance created: " + instance);
    }
}

Class.newInstance()的问题

• 必须有无参构造函数:Class.newInstance()要求类必须有一个可访问的无参构造函数。

• 不支持私有构造函数:如果类的无参构造函数是私有的,Class.newInstance()会抛出IllegalAccessException

• 已被废弃:从 Java 9 开始,Class.newInstance()被标记为废弃,推荐使用替代方法。

替代方法
从 Java 9 开始,推荐使用以下替代方法来创建类的新实例:

1.Constructor.newInstance()
使用Constructor类的newInstance()方法可以更灵活地创建对象,支持私有构造函数。

示例代码

import java.lang.reflect.Constructor;

public class MyClass {
    private MyClass() {
        System.out.println("Private constructor called");
    }

    public static void main(String[] args) throws Exception {
        // 获取 MyClass 的私有无参构造函数
        Constructor<MyClass> constructor = MyClass.class.getDeclaredConstructor();
        // 设置构造函数可访问
        constructor.setAccessible(true);
        // 使用 Constructor.newInstance() 创建对象
        MyClass instance = constructor.newInstance();
        System.out.println("Instance created: " + instance);
    }
}

2.Class.getDeclaredConstructor()Constructor.newInstance()
如果你需要更灵活地处理构造函数,可以结合使用Class.getDeclaredConstructor()Constructor.newInstance()

示例代码

import java.lang.reflect.Constructor;

public class MyClass {
    private MyClass() {
        System.out.println("Private constructor called");
    }

    public static void main(String[] args) throws Exception {
        // 获取 MyClass 的私有无参构造函数
        Constructor<MyClass> constructor = MyClass.class.getDeclaredConstructor();
        // 设置构造函数可访问
        constructor.setAccessible(true);
        // 使用 Constructor.newInstance() 创建对象
        MyClass instance = constructor.newInstance();
        System.out.println("Instance created: " + instance);
    }
}

总结

Class.newInstance():调用类的无参构造函数来创建对象,但已被废弃。

Constructor.newInstance():推荐的替代方法,支持私有构造函数。

Class.getDeclaredConstructor()Constructor.newInstance():更灵活的替代方法,可以处理私有构造函数。

通过使用Constructor.newInstance()Class.getDeclaredConstructor()Constructor.newInstance()的组合,你可以更灵活地创建类的实例,同时避免Class.newInstance()的限制和问题。

MainTest2.java

import org.example.User;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class MainTest2 {
    @Test
    public void testA() throws Exception {
        createUser1();

        createUser2();
    }

    private static void createUser2() throws Exception {
        Constructor<?> declaredConstructor = Class.forName("org.example.User").getDeclaredConstructor();
        //declaredConstructor.setAccessible(true);
        User user = (User) declaredConstructor.newInstance();
        user.name = "x2";
        System.out.println(user);
    }

    private static void createUser1() throws Exception {
        // 获取 MyClass 的私有无参构造函数
        Constructor<User> constructor = User.class.getDeclaredConstructor();
        // 设置构造函数可访问
        //constructor.setAccessible(true);

        User user = constructor.newInstance();
        user.name = "x1";
        System.out.println(user);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值