当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/113327.html

相关文章:

  • 硬币找零问题
  • 特征值与特征向量:从理论到应用的全面解析
  • Java类加载问题
  • STM32单片机入门学习——第16节: [6-4] PWM驱动LED呼吸灯PWM驱动舵机PWM驱动直流电机
  • 《AI大模型应知应会100篇》第4篇:Transformer架构深入浅出:大模型的基石
  • cadence17.4和16.6同时安装无法使用的问题
  • 关于图片分类任务的猜想 | 撰写论文 paper
  • .net多贸易公司借入借出归还设备进销存管理系统软件租金计算库存管理
  • M芯片,能运行普通应用程序的原架构虚拟机
  • Java的Selenium元素定位-xpath
  • LeetCode热题100记录-【二叉树】
  • 【Deep Reinforcement Learning Hands-On Third Edition】【第1章:什么是强化学习】
  • 《海空重力测量理论方法及应用》之一重力仪系统组成及工作原理(下)
  • qt designer 软件主题程序设计
  • Python精进系列:从 __name__ 开始了解 python 常见内置变量
  • synchronized 锁升级机制详解
  • ROS2 多机时间同步(Chrony配置简明指南)
  • docker本地部署anythingllm
  • C++重载运算符的本质
  • 将 DataFrame 中某一列的列表拆分成多个独立的列的方式
  • Linux上位机开发实践(做一专多能的方案提供者)
  • 从情感分析到朴素贝叶斯法:基于朴素贝叶斯的情感分析如何让DeepSeek赋能你的工作?
  • 【Kubernetes】RBAC(基于角色的访问控制)如何设置?如何管理 Kubernetes 的权限?
  • MCP 极简入门 - 三分钟 Cline + Smithery 运行 time 服务
  • HTTP/2:新一代网络协议的变革与优势
  • 借 DCMM 东风,提升数据管理价值生产力
  • BugKu Simple_SSTI_2
  • 【UE5 C++课程系列笔记】31——创建Json并保存为文件
  • 横扫SQL面试——TopN问题
  • 团体设计程序天梯赛L2-025 # 分而治之