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

时间:2017-09-05 08:41:37

标签: java reflection

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

有没有办法阻止它们运行?我需要类对象,而不仅仅是通过黑客攻击类二进制文件可以得到的信息。

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

2 个答案:

答案 0 :(得分:1)

如果您依赖包含该类所包含的所有内容的真实类,除非您修补虚拟机,否则您将无法使用静态初始化程序。

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

使用Powermock/Mockito来抑制静态初始化的建议与Reflection库的方向类似。两个Test框架在加载之前都会更改类的字节码,导致类与原始类略有不同。

答案 1 :(得分:0)

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

Class.forName(className, false, this.getClass().getClassLoader());

第二个参数为initialize,用于标记是否要初始化类。

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

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

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

请参阅:Class.forName documentation (Oracle Java SE7)