Java Class.forname(";name";).newInstance()与name.Class.newInstance:使用角度的差异

Java Class.forname(";name";).newInstance()与name.Class.newInstance:使用角度的差异,java,reflection,Java,Reflection,我将从我的例子开始: 我有一个类classload.Loadable package classload; public class Loadable { static{ System.out.println("Loaded already....."); } public Loadable(){ System.out.println("Now created....."); } } 将通过以下两种方式加载和创建实例 第一名:

我将从我的例子开始: 我有一个类
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();
            }
秒:

 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
对象的位置。它可能成功,也可能失败,这取决于所需的类是否有效。表示在运行时创建的实例

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


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

最简单的解决方案是使用

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

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

Class.forName("classload.Loadable").newInstance();
因为更清楚的是将抛出哪些异常

问题在于

classload.Loadable.class.newInstance()
这两种情况下都不是特别有用


注意:
Class.newInstance()
存在一个已知问题,即它将抛出您不知道的已检查异常。i、 e.如果构造函数抛出一个选中的异常,它将不会被包装,编译器也无法判断将抛出什么。

name.class
是一个,而不是一个运算符
Class.forName()
返回一个类,而不是一个实例,如果您想要一个实例,
newInstance()
确实是必需的。使用
classload.Loadable.Class.newInstance()
而不是只使用
new classload.Loadable()会很奇怪
。同意。我将其包含在创建此示例中。实际上,在我的示例中,我将获取一个类作为方法的参数,在该方法中创建实例。