首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Class.forname(“名称”).newInstance()与name.class.newInstance :使用角度的差异

Class.forname(“名称”).newInstance()与name.class.newInstance :使用角度的差异
EN

Stack Overflow用户
提问于 2015-10-03 06:08:12
回答 2查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
package classload;

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

它将以以下两种方式加载和创建实例。

First:

代码语言:javascript
复制
 public static void main(String[] args) throws Exception {
                System.out.println("Starting .....");
                Class.forName("classload.Loadable").newInstance();
            }

第二版:

代码语言:javascript
复制
 public static void main(String[] args) throws Exception {
                System.out.println("Starting .....");

                classload.Loadable.class.newInstance();
            }

Class.forname都提供了与预期相同的输出(因为返回相同的对象)

代码语言:javascript
复制
Starting .....
Loaded already.....
Now created.....

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-03 09:24:05

最简单的解决办法是使用

代码语言:javascript
复制
new Loadable();

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

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

代码语言:javascript
复制
Class.forName("classload.Loadable").newInstance();

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

问题在于

代码语言:javascript
复制
classload.Loadable.class.newInstance()

在这两种情况下都不是特别有用。

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

票数 3
EN

Stack Overflow用户

发布于 2015-10-03 06:23:23

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

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

第二个调用类型等价于Loadable loadable = new Loadable()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32919494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档