【问题标题】:How can I create an instance of type dynamically in Java如何在 Java 中动态创建类型实例
【发布时间】:2009-10-09 08:26:26
【问题描述】:

在我的 Java 应用程序中,我有方法

public <T extends Transaction> boolean appendTransaction(T transaction) {
   ...
}

在这个方法中,我需要创建一个扩展 Transaction

的对象实例 T

这样做对吗

T newTransaction = (T) transaction.getClass().newInstance();

【问题讨论】:

    标签: java dynamic-typing


    【解决方案1】:

    我认为您应该使用 T 类型的工厂接口,这样您就可以在方法用户上强制创建实例接口。

    public <T extends Transaction> boolean appendTransaction(
            T transaction, 
            Factory<T> factory) {
        ...
        T newTransaction = factory.createTransaction();
        ...
    }
    

    【讨论】:

    • 我有点同意你的看法。它绝对更干净,更不神奇。
    【解决方案2】:

    或多或少,除了Class.newInstance 是邪恶的:

    请注意,此方法会传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。

    改用transaction.getClass().getConstructor().newInstance(),它用InvocationTargetException包装构造函数中抛出的异常。

    【讨论】:

    • 比 getConstructor().newInstance() 的别名更邪恶吗?
    • 我更新的动机。它神奇地重新抛出默认构造函数抛出的任何异常,甚至是你无法显式捕获的已检查异常(因为Class.newInstance 没有在其签名中声明它们)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多