微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java中是否存在零时间启动(无重新编译)可切换条件标志?

我正在寻找一种方法来提供最快(我的意思是零时间 – 编译/类加载/ 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是否或何时会启动.

原文地址:https://www.jb51.cc/java/127269.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐