资讯专栏INFORMATION COLUMN

用代码判断当前系统是否支持某个版本的feature

bang590 / 2564人阅读

摘要:已经出来有一段时间了,因此很多流行的应用纷纷增添了对乃至的支持,比如。来自,这个类正是引入的。因此如果用加载不到这个类,一定说明当前的运行环境是以下。通过这种方式进行运行环境的检测比准确,因为后者获取的信息理论上有可能被别人用覆盖。

JDK9已经出来有一段时间了,因此很多流行的Java应用纷纷增添了对JDK9乃至JDK10的支持,比如Tomcat。

我们通过这个链接下载最新的Tomcat源文件包,总共7MB:

https://tomcat.apache.org/dow...

解压之后,在文件夹apache-tomcat-9.0.10-srcjavaorgapachecatalinacore里找到文件JreMemoryLeakPreventionListener.java:

可以看到大量调用工具类JreCompat检测JRE9是否可用:

JreCompat.isJre9Available()

查看isJre9Available的具体实现:

public static boolean isJre9Available() {

     return jre9Available;

}

被一个boolean控制:jre9Available。

jre9Available这个boolean被Jre9Compat.isSupported()控制:

static {

  // This is Tomcat 9 with a minimum Java version of Java 8.

  // Look for the highest supported JVM first

  if (Jre9Compat.isSupported()) {

      instance = new Jre9Compat();

      jre9Available = true;

} else {

     instance = new JreCompat();

     jre9Available = false;

  }

}

再看Jre9Compat.isSupported()的代码:

static boolean isSupported() {

     return inaccessibleObjectExceptionClazz != null;

}

一旦inaccessibleObjectExceptionClazz不为null,说明JRE9可用。

inaccessibleObjectExceptionClazz来自Class.forName("java.lang.reflect.InaccessibleObjectException"),

java.lang.reflect.InaccessibleObjectException这个类正是Java 9引入的。因此如果用Class loader加载不到这个类,一定说明当前的运行环境是Java 9以下。

通过这种方式进行Java运行环境的检测比System.getProperty准确,因为后者获取的信息理论上有可能被别人用setProperty覆盖。

ABAP

通过表CVERS查看Software component的版本信息:

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71932.html

相关文章

  • 浅聊Python class中@staticmethod以及@classmethod

    摘要:然而,作为学生代表的我,绝对不允许老师混入进来充当间谍。而且,该方法由所独享,并不需要判断是否为学生。由此,改进为以下版本。得到如下测试代码而对于教学分类的判断,则有以下两种情形。 前言 入学不久之后,我就在想,对于学校的这么多人,这么多教师,这么多学生,以及其他种种事物,能否对应的做一套系统下来呢?随之也跟着思考了起来。 设计 好了,最直观的映入大脑的就是三个实体:人、教师、学生。这...

    baoxl 评论0 收藏0
  • 【腾讯bugly干货】关于 Android N 那些你不知道事儿

    今年3月,Google 破天荒提前半年发布了 Android N 开发者预览版。当然,作为一个不合格的谷粉并没有第一时间体验安装,因为至今仍然能够回忆起来去年今日此门中(雾)兴冲冲刷了 Android M Preview 的时候发现各种 Crash 就连微信也(不出所料得)中招时自己一脸懵逼的心情。当然,为自己的机智而庆幸并没有过多久,很快就有微信好友(当然也是纯纯的谷粉)反馈微信又双叒叕在 An...

    zombieda 评论0 收藏0
  • Kubernetes如何加速UCloud内部代码部署CI/CD流程

    摘要:内部长期使用来管理代码。审核通过并且成功后,触发静态测试单元测试镜像构建镜像部署集成测试等测试通过后,创建一个从到的,由负责人进行审核。从图中我们可以看到,部分是一个单元测试,预发布部署,集成测试,,提交代码的循环过程。UCloud内部长期使用 Gitlab 来管理代码。虽然Gitlab作为一套开源平台已很优秀,但我们对于其能为CI/CD提供的敏捷性并不十分满意,内部实践中的代码发布周期仍需...

    gougoujiang 评论0 收藏0
  • 如何设计npm包开发和发布流程

    摘要:所以此版本号在这里的作用并不是用来区分版本的,小版本号才是真正用来做版本区分的,那么在引用这个就要这么来控制版本号,举个栗子锁定大版本号和小版本号,不管我们开发过程中提交了多少次,我们引用都是最新的。 最近在把公司内部用的一个库发布到内网的npm私服上,仅仅是发布的话是比较简单的,但这个库是由多个人一起维护的,而且npm私服只有一套,所以生产环境和开发环境,用的是同一个,那么,我们的需...

    qieangel2013 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<