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

时间:2015-10-03 06:08:12

标签: java reflection

我将从我的例子开始: 我有一个班级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对象

2 个答案:

答案 0 :(得分:2)

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

name.class.newInstance()class是一个类文字,它被评估为编译时常量。如果引用的类无效并且存在于类路径中,它仍然可以在运行时失败,但它可以在需要常量表达式的位置使用。

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

答案 1 :(得分:2)

最简单的解决方案是使用

new Loadable();

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

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

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

因为更清楚地会抛出哪些例外。

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

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

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