Java JVM试图加载一个非';我没打电话

Java JVM试图加载一个非';我没打电话,java,Java,我正在编写代码,如果“mod”存在于类路径中,则向其添加函数(由pixelmonPresent引用) ,ItemHammer仅当存在pixelmon时才存在 我遇到的问题是,如果我在课堂上这样做(同一个包) 这将导致在PixelHammerTool上找不到类, 如果if语句为false,为什么会调用它?我能做些什么?为什么简单而直接:因为当加载一个类时,它引用的所有类都会加载。(事实上,它们是先加载的。) 避免它也不太复杂,尽管代码看起来不太好看:您需要使用反射加载类,使用从class.getC

我正在编写代码,如果“mod”存在于类路径中,则向其添加函数(由
pixelmonPresent
引用)

ItemHammer
仅当存在
pixelmon
时才存在

我遇到的问题是,如果我在课堂上这样做(同一个包)

这将导致在
PixelHammerTool
上找不到类,
如果if语句为false,为什么会调用它?我能做些什么?

为什么简单而直接:因为当加载一个类时,它引用的所有类都会加载。(事实上,它们是先加载的。)

避免它也不太复杂,尽管代码看起来不太好看:您需要使用反射加载类,使用从
class.getConstructors()
返回的数组中找到所需的构造函数,然后使用
constructor.newInstance()
创建实例


请注意,如果这种情况在代码中只发生几次,那么这个解决方案很好,如果您发现自己经常这样做,那么您可能应该寻找一个依赖项注入框架,它将为您完成繁重的工作。

原因简单明了:因为当加载一个类时,它引用的所有类也被加载。(事实上,它们是先加载的。)

避免它也不太复杂,尽管代码看起来不太好看:您需要使用反射加载类,使用从
class.getConstructors()
返回的数组中找到所需的构造函数,然后使用
constructor.newInstance()
创建实例

请注意,如果这种情况在代码中只发生过几次,那么这个解决方案很好,如果您发现自己经常这样做,那么您可能应该寻找一个依赖项注入框架,它将为您完成繁重的工作。

在规范的一节下,我们看到:

例如,Java虚拟机实现可以选择在使用类或接口时单独解析每个符号引用(“延迟”或“延迟”解析),或者在验证类时一次性解析所有符号引用(“急切”或“静态”解析)。这意味着在某些实现中,在类或接口初始化之后,解析过程可能会继续。无论采用哪种策略,解析过程中检测到的任何错误都必须在程序中(直接或间接)使用类或接口的符号引用的某个点抛出

因此,当必须定义常量时,它依赖于实现,基于类加载器。您看到的行为与前面提到的“渴望”解决方案是一致的:当您在代码中引用
PixelHammerTool
时,即使是针对一个永远不会被命中的运行时路径,类装入器也会尝试在其定义中链接,而该定义并不存在

这种策略导致JVM启动较慢,但在运行时执行较快,这通常是我熟悉的所有实现中采用的策略。实际上,默认类加载器被命名为“bootstrap类加载器”,因为它具有这种行为——在JVM引导时加载类

您可以按照biziclop的建议(更简单的方法),通过反射实例化类,强制在运行时进行链接,也可以查找或创建一个类加载器,延迟实例化类。

在规范中的部分下,我们看到:

例如,Java虚拟机实现可以选择在使用类或接口时单独解析每个符号引用(“延迟”或“延迟”解析),或者在验证类时一次性解析所有符号引用(“急切”或“静态”解析)。这意味着在某些实现中,在类或接口初始化之后,解析过程可能会继续。无论采用哪种策略,解析过程中检测到的任何错误都必须在程序中(直接或间接)使用类或接口的符号引用的某个点抛出

因此,当必须定义常量时,它依赖于实现,基于类加载器。您看到的行为与前面提到的“渴望”解决方案是一致的:当您在代码中引用
PixelHammerTool
时,即使是针对一个永远不会被命中的运行时路径,类装入器也会尝试在其定义中链接,而该定义并不存在

这种策略导致JVM启动较慢,但在运行时执行较快,这通常是我熟悉的所有实现中采用的策略。实际上,默认类加载器被命名为“bootstrap类加载器”,因为它具有这种行为——在JVM引导时加载类


您可以按照biziclop的建议(更简单的方法)通过反射实例化类,这会在运行时强制链接,也可以查找或创建一个延迟实例化类的类加载器。

编译时与运行时?在编译时类存在。编译时与运行时?在编译时类存在。
PixelHammerTool extends ItemHammer
if(Basemod.pixelmonPresent) {
rubyHammer = new PixelHammerTool(Basemod.RUBY, "pixelutilitys:RubyHammer", "rubyHammer");
}