java 8代码 改 java7_可以编译Java 8代码以在Java 7 JVM上运行吗?

默认方法需要对字节码和JVM进行此类更改,而这些更改在Java 7中是不可能的.Java 7及更低版本的字节码验证程序将拒绝具有方法体的接口(静态初始化方法除外) . 尝试使用调用方的静态方法模拟默认方法不会产生相同的结果,因为可以在子类中重写默认方法 . Retrolambda对反向移植默认方法的支持有限,但它永远不能完全向后移植,因为它确实需要新的JVM功能 .

如果必要的API类存在那里,Lambdas可以按原样在Java 7上运行 . invokedynamic指令存在于Java 7上,但它可以实现lambdas,以便它在编译时生成lambda类(早期的JDK 8版本就是这样做的),在这种情况下它可以在任何Java版本上运行 . (Oracle决定使用invokedynamic for lambdas进行未来验证;也许有一天JVM将具有一流的功能,因此可以更改invokedynamic以使用它们而不是为每个lambda生成一个类,从而提高性能 . )Retrolambda所做的是它处理所有这些invokedynamic指令并用匿名类替换它们;与第一次调用lamdba invokedynamic时Java 8在运行时所做的相同 .

Repeating Annotations只是语法糖 . 它们与先前版本的字节码兼容 . 在Java 7中,您只需要自己实现辅助方法(例如getAnnotationsByType),该方法隐藏包含重复注释的容器注释的实现细节 .

AFAIK,Type Annotations仅在编译时存在,因此它们不应该要求更改字节码,因此只需更改Java 8编译类的字节码版本号就足以使它们在Java 7上运行 .

Method parameter names存在于Java 7的字节码中,因此's also compatible. You can get access to them by reading the bytecode of the method and looking at the local variable names in the method'的调试信息 . 例如,Spring Framework正是为了实现@PathVariable,所以可能有一个库方法可以调用 . 因为Java 7中的接口方法不存在抽象接口方法,Java 8上也不存在AFAIK .

Summa summarum,默认方法需要新的JVM功能,但其他语言功能需要在Java 8中编译代码,然后将字节码转换为Retrolambda到Java 5/6/7格式 . 至少需要更改字节码版本,并且javac不允许 -source 1.8 -target 1.7 因此需要使用逆向转换器 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值