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()会很奇怪
。同意。我将其包含在创建此示例中。实际上,在我的示例中,我将获取一个类作为方法的参数,在该方法中创建实例。