我正在寻找一种方法来提供最快(我的意思是零时间 – 编译/类加载/ JIT时间已解决)if条件的可能On / Off标志.当然,每次应用程序运行时,此条件只会更改一次 – 启动时.
我知道可以条件编译“条件编译时常量”,并且可以从代码中删除整个条件.但是,无需重新编译源代码,最快(也可能是简单)的替代方案是什么?
我可以将条件移动到单独的类和.jar.有条件的方法,我生成.jar的两个版本,并在应用程序启动时在类路径中打开那些版本? JIT是否会在单独的.jar中删除对方法的调用,如果发现该方法为空?
我可以通过在类路径中实现“ClassWithMyCondition”提供两个类来实现,其中一个类将具有真正的实现,第二个将只有空方法并通过Class.forName和.newInstance()实例化其中一个?将JIT删除从我的主要循环嵌套方法调用空方法?
什么可以是最简单的字节码操作解决这个问题?
解决方法
您可以在命令行中传递自定义值,然后检查该值一次.所以在你的代码中,有这样的东西:
final static boolean customProp = "true".equalsIgnoreCase(System.getProperty("customProp"));
根据您的命令行参数,静态最终值将更改.这会将值设置为true:
java -DcustomProp="true" -jar app.jar
虽然这会将值设置为false:
java -jar app.jar
这为您提供了静态最终布尔值的好处,但允许在不重新编译的情况下更改该值.
[编辑]
如注释中所示,此方法不允许在编译时进行优化. static final boolean的值在classload上设置,并且从那里保持不变.字节码的“正常”执行可能需要评估每个if(customProp).但是,JIT在运行时发生,将字节码编译为本机代码.此时,由于字节码具有运行时值,因此可以进行更积极的优化,例如内联或排除代码.请注意,您无法准确预测JIT是否或何时会启动.