编译时 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上,那么高版本的字节码到底比低版本有什么好处呢?

你可能感兴趣的:(编译时 source和target的java版本)