【问题标题】:Java usecase of overloaded version of Class.forName()Class.forName() 重载版本的 Java 用例
【发布时间】:2012-06-15 07:38:49
【问题描述】:

Class.forName()的重载版本有什么用?

public static Class<?> forName(String name,
                       boolean initialize,
                       ClassLoader loader)
                throws ClassNotFoundException

任何人都可以举一个首选使用的例子。

编辑:

参考下面的代码。

Class  clz=(Class)Class.forName("com.test.classloader.MyClass", false, Thread.currentThread().getContextClassLoader());

        MyClass mc=(MyClass) clz.newInstance();
        System.out.println(mc.TEST);
        System.out.println(mc.i);

我的班级:

public class MyClass {

static String TEST="MYCLASS";
static int  i;
static{
    i=20;
}

}

为什么会打印

MYCLASS

20

【问题讨论】:

  • javadoc 非常适合该方法。你看过了吗?
  • 是的,但我的问题是布尔初始化。

标签: java reflection overloading


【解决方案1】:

如果您想使用特定的ClassLoader 加载Class,您可以使用此方法,该loader 参数通过loader 参数传递。

initialize 布尔值也会说明您是否希望初始化该类。

很简单。

【讨论】:

  • 初始化是什么意思?变量的初始化?
  • 初始化是step in the ClassLoading process。这是将类变量设置为其默认值的地方。
  • @amicngh 该类必须在某个时候进行初始化。在您的示例中,它将在您创建实例时,而不是在加载类时。请阅读我在上述评论中发布的链接。
【解决方案2】:

初始化是在那个时候是否调用静态块。

如果您使用任何静态字段或方法,则必须调用静态块,这样您就看不到行为。

您可以做的是在静态块和您的示例中添加一个调试输出,以查看它们被调用的顺序。 (或者给静态块加个异常)

【讨论】:

  • 我想他要问的是为什么当他指定类不在forName()中初始化时执行静态块。
  • 我以为我已经回答了。 ;) 它没有在forName 中初始化,但在可以使用之前已经初始化。
猜你喜欢
  • 1970-01-01
  • 2013-08-06
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多