Java ‘newInstance()‘ 自版本 9 起已弃用

下面示例演示了从 Java 9 开始不推荐使用的 Class::newInstance() 方法如何被替换为更安全且明确的 Class::getDeclaredConstructor().newInstance()。后者能更好地处理构造方法相关的异常,并避免一些潜在的安全问题。


原先的(已弃用)写法

java 复制代码
public class ReflectionDemo {

    public static void main(String[] args) {
        try {
            // 自 Java 9 起已弃用
            MyClass instance = MyClass.class.newInstance(); 
            instance.sayHello();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    public void sayHello() {
        System.out.println("Hello from MyClass!");
    }
}

问题说明

  1. 不再推荐 :自 Java 9 起,Class::newInstance() 方法被标记为 Deprecated,因为它不支持处理构造方法相关的异常类型,且存在一定的安全风险。
  2. 异常处理不足 :如果构造方法本身抛出受检异常,newInstance() 只能将其包装为 InstantiationException 或 IllegalAccessException,信息不够明确。

推荐的写法:使用 getDeclaredConstructor().newInstance()

java 复制代码
public class ReflectionDemo {

    public static void main(String[] args) {
        try {
            // 推荐方式,能准确处理构造方法异常
            MyClass instance = MyClass.class
                    .getDeclaredConstructor() 
                    .newInstance();
            instance.sayHello();
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    public void sayHello() {
        System.out.println("Hello from MyClass!");
    }
}

优点说明

  1. 异常处理更清晰 :newInstance() 仅抛出 InstantiationException 和 IllegalAccessException;而 getDeclaredConstructor().newInstance() 可以抛出 InvocationTargetException 等更多与构造方法相关的异常,异常信息更具体。
  2. 安全性更好 :结合语言规范和 JDK 未来演进,使用 getDeclaredConstructor().newInstance() 能更好地适配模块化与安全策略。
  3. 更符合现代规范:这是官方推荐的方式,不仅能处理有参构造,还能细化对访问权限与异常的控制。

总结

  • 已弃用 :Class::newInstance() 自 Java 9 起被标记为 Deprecated,不再建议使用。
  • 替代方案 :Class::getDeclaredConstructor().newInstance(),能够安全、明确地实例化对象,并更好地处理构造方法异常。
相关推荐
niucloud-admin3 分钟前
NIUCLOUD LITE AI开发文档—模块开发:支付管理
开发语言
云和数据.ChenGuang22 分钟前
print(f“a+b=“,result) print(f“a+b={result}“)区别
java·前端·人工智能·python·深度学习
2601_9628857232 分钟前
如何用 Python 算最大回撤和回撤恢复期?
java·数据库·python
dear_bi_MyOnly43 分钟前
栈和队列:从原理到应用全解析
c语言·开发语言·c++·学习·分类
Want5951 小时前
Python大雪纷飞①
开发语言·python·数学建模
毕业设计7031 小时前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm
yujunl1 小时前
重写了一个BOM查询的脚本
开发语言
Q26433650231 小时前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计
事圆则缓1 小时前
Kotlin 集合与序列:给页面一份清楚的数据
开发语言·windows·kotlin
事圆则缓2 小时前
Kotlin 异步与并发:从一次搜索请求走到状态流
android·开发语言·kotlin