Class.forname("name").newInstance() vs name.class.newInstance :使用角度的差异

Class.forname("name").newInstance() vs name.class.newInstance : Difference in usage perspective

我将从我的示例开始: 我有一个 class classload.Loadable .

package classload;

public class Loadable {
    static{
        System.out.println("Loaded already.....");
    }
    public Loadable(){
        System.out.println("Now created.....");
    }
}

将通过以下2种方式加载和创建实例。

第一个:

 public static void main(String[] args) throws Exception {
                System.out.println("Starting .....");
                Class.forName("classload.Loadable").newInstance();
            }

第二个:

 public static void main(String[] args) throws Exception {
                System.out.println("Starting .....");

                classload.Loadable.class.newInstance();
            }

两者都给出与预期相同的输出(因为 Class.forname returns 相同的 class 对象):

Starting .....
Loaded already.....
Now created.....

我想知道我们使用了哪些场景Class.forname以及我们可以直接使用.class对象的任何地方

Class.forName().newInstance() 在运行时加载 class。它可能会成功,也可能会失败,这取决于所需的 class 是否有效。表示您的实例是在运行时创建的。

name.class.newInstance()class 是一个 class 字面值,它作为编译时常量计算。如果引用的 class 无效且存在于 class 路径中,它仍然会在运行时失败,但它可以用于需要常量表达式的地方。

第二种调用方式等同于Loadable loadable = new Loadable()

最简单的解决方案是使用

new Loadable();

如果 class 在编译时已知并且您希望它在运行时可用。注意:如果不可用,这将在运行时抛出 NoClassDefError

如果您不确定它是否会在运行时可用,您可以使用

Class.forName("classload.Loadable").newInstance();

因为更清楚将抛出哪些异常。

的问题
classload.Loadable.class.newInstance()

是它在任何一种情况下都不是特别有用。

注意:Class.newInstance() 有一个已知问题,它会抛出您不知道的 checked 异常。也就是说,如果构造函数抛出一个已检查的异常,它不会被包装并且编译器无法判断将抛出什么。