Java 如何抑制类初始值设定项的执行

Java 如何抑制类初始值设定项的执行,java,reflection,Java,Reflection,我需要在第三方类上调用一堆Class.forName(),但这会导致所有受影响的类都运行静态初始值设定项。这种静态初始值设定项的运行是我想要避免的一个不希望出现的副作用,因为逻辑会引入各种其他依赖项和其他垃圾 有没有办法防止它们运行?我需要类对象,而不仅仅是通过破解类二进制文件可以获得的信息 我知道在调用方法之前需要正确初始化类。我没有对这些类的代码做任何事情,我希望它们被冻结。如果您依赖于包含该类所包含的所有内容的真实类,则必须使用静态初始值设定项,除非您修补虚拟机 如果您只需要类元信息(例如

我需要在第三方类上调用一堆Class.forName(),但这会导致所有受影响的类都运行静态初始值设定项。这种静态初始值设定项的运行是我想要避免的一个不希望出现的副作用,因为逻辑会引入各种其他依赖项和其他垃圾

有没有办法防止它们运行?我需要类对象,而不仅仅是通过破解类二进制文件可以获得的信息


我知道在调用方法之前需要正确初始化类。我没有对这些类的代码做任何事情,我希望它们被冻结。

如果您依赖于包含该类所包含的所有内容的真实类,则必须使用静态初始值设定项,除非您修补虚拟机

如果您只需要类元信息(例如类的方法名、实现的接口),您可以使用类似的库


您建议使用以抑制静态初始化,其方向与反射库类似。这两个测试框架在加载之前都会更改类的字节码,导致类与原始类略有不同

无需使用任何其他库,您只需执行以下操作:

Class.forName(className, false, this.getClass().getClassLoader());
其中第二个参数是
initialize
,用于标记是否要初始化类

仅当initialize参数为true且之前未初始化时,才初始化该类

forName
的单参数调用只是一个方便的包装:

返回与具有给定字符串名称的类或接口关联的类对象。调用此方法相当于:
Class.forName(className,true,currentLoader)


请参阅:

您需要类对象还是只需要类存在的信息?您需要如何处理
实例?除非这是“非常元的”(例如列出方法签名),否则需要初始化该类。Java当然不会允许您在没有“正确”设置的情况下调用其任何代码。如果您需要加载类,则无法抑制静态初始化,除非您特意编写自己的VM或修改现有VM。@Turing85我认为使用某些实现似乎是可能的。我没有使用mockito,但如果mockito可以做到,我希望有一个标准的方法,我可以做到这一点well@MishaxMockito在内部使用类字节码进行调节。所以你最终不会有真正的类对象。这反过来又可以归结为类似于这个库的东西:我假设只使用这个库会更容易;)