加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 23:49:29 所属栏目:Java 来源:网络整理
导读:我正在寻找一种方法来提供最快(我的意思是零时间 – 编译/类加载/ JIT时间已解决)if条件的可能On / Off标志.当然,每次应用程序运行时,此条件只会更改一次 – 启动时. 我知道可以条件编译“条件编译时常量”,并且可以从代码中删除整个条件.但是,无需重新编译
我正在寻找一种方法来提供最快(我的意思是零时间 – 编译/类加载/ 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是否或何时会启动.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读