编译时 source和target的java版本

概要

Javac编译时,只允许target的版本高于source的版本,因为只有高版本才可能兼容低版本,原因是 - 反证法 - 如果我的java代码里用到了java8的lambda表达式,那么我编译的时候告诉javac源代码用1.8的语法进行解释,目标字节码用1.4的来表示,但1.4的java里根本没有办法表达lambda,所以是行不通的。因此代码只能按照低版本的java语法进行编译,然后生成高版本的字节码;

实践

用HelloWorld来测试,拒绝编译的 -


C:\>javac-source 1.8 -target 1.4 E:\eclipse\workspace\Java8\src\HelloWorld.java


javac: source release 1.8 requires target release 1.8


Eclipse在target低于source java时也会有类似的提示 -‘Classfile compatibility must be equal or greater than source compatibility.’

如下是可以编译的,尽管有warning -


C:\>javac-source 1.4 -target 1.8E:\eclipse\workspace\Java8\src\HelloWorld.java


warning: [options] bootstrap class path not set in conjunction with -source 1.4


warning: [options] source value 1.4 is obsolete and will be removed in a future release


warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.3 warnings


实践和问题

结合到实际工作中 - legacy的代码是1.4编写的,我们不想改动代码,为了提高性能, 直接把1.4的字节码运行在1.7的JVM上;其实可以通过source 1.4,target 1.7来生成高版本的字节码,然后运行在1.7的JVM上。既然1.4和1.7的字节码都能运行在1.7的JVM上,那么高版本的字节码到底比低版本有什么好处呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,926评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,083评论 19 139
  • 文章来源:http://www.kissyu.org/2016/08/29/ConcurrentHashMap的j...
    极乐君阅读 1,020评论 0 0
  • 离开你之前我曾写过一封信,是在西安去济南的火车上写的,写的时候我哭了好久,眼泪滴落到纸上,以至于下火车时纸还是...
    蓝桉sama阅读 254评论 0 0
  • ​2017河北省海洋日宣传活动 及第二届“蓝色海洋我的梦想” ——山里孩子去看海公益活动在唐山举行 6月8...
    公益河北阅读 218评论 0 0