gpt4 book ai didi

Java 确保类已解析

转载 作者:行者123 更新时间:2023-11-30 08:26:05 25 4
gpt4 key购买 nike

我遇到了一种情况,我想有条件地加载和解析一个类。加载它就像获取正确的 ClassLoader 句柄并调用 loadClass 方法一样简单。在调用 loadClass 方法后,我得到了我想要加载的类的有效句柄。但是,目标类的静态初始化器不会被调用,因为该类直到稍后才被解析。不幸的是,类静态初始化程序注册了重要的回调。下面显示了一个示例。

public class ClassA
{
public static void main(String[] args) throws Throwable
{
Class<?> classB = ClassA.class.getClassLoader().loadClass("ClassB");
System.out.println(classB.getName());
}

}

public class ClassB
{
static
{
System.out.println("Class B initializer.");
}
}

本例运行ClassA的输出当然是:ClassB

我找到了一个临时解决方法(在我看来)有点麻烦那就是在 ClassB 中调用一个不重要的静态函数,它强制解析该类。该方法如下所示。

public class ClassA
{
public static void main(String[] args) throws Throwable
{
Class<?> classB = ClassA.class.getClassLoader().loadClass("ClassB");
classB.getMethod("something").invoke(null);
System.out.println(classB.getName());
}
}

public class ClassB
{
static
{
System.out.println("Class B initializer.");
}
public static void something(){}
}

此方法的输出是(如预期的那样):

Class B Initializer.
ClassB

这个方法有很多问题,例如我必须依赖具有公共(public)静态函数的类,并且担心调用该函数的任何副作用。是否有更合法的方法来强制类解析?

最佳答案

您可以使用 Class.forName(..)初始化您的类并获取对其 Class 对象的引用。

Class<?> classB = Class.forName("ClassB");

javadoc 状态

A call to forName("X") causes the class named X to be initialized.

相关:

关于Java 确保类已解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21794234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com