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



我将从我的例子开始:我有一个班classload.Loadable

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

将通过以下两种方式加载并创建实例:

:

 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返回相同的class对象):

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

我想知道我们使用Class.forname的所有场景以及我们可以直接使用.class对象的地方

最简单的解决方案是使用

new Loadable();

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

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

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

,因为更清楚地知道将抛出哪些异常。

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

在这两个上下文中都不是特别有用。

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

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

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

第二个调用类型相当于Loadable loadable = new Loadable()

相关内容

最新更新