Retrotranslator:java逆向移植工具

阅读更多
1.JDK每次升级新增的功能大致可以分为4类:
①在编译层面做的改进.如自动装箱拆箱,实际上就是编译器在程序中使用到包装对象的地方自动插入很多Integer.valueOf()之类的代码,泛型的信息在编译阶段就被擦除,相应的地方被编译器自动插入了类型转换代码.
②对Java API的代码增强.如在JDK1.2中增加了java.util.Collections等一系列集合类,在JDK1.5中增加了并发包
③需要在字节码中进行支持的改动.如在JDK1.7中增加了动态语言支持,就需要在虚拟机中增加一条invokedynamic字节码指令来实现相关的调用功能.(字节码指令集一直处于较稳定状态,这种需要在字节码层面直接进行的改动很少见)
④虚拟机内部的改进,如在JDK1.5中实现的JSR-133规范(Java内存模型和线程规范修订)中重新定义的java内存模型,CMS收集器之类的改动,这些改动对程序员编写的代码是透明的,但是对程序运行会产生影响.

2.Retrotranslator作用:将JDK1.5(主版本号49)编译出来的class文件转变为可以在JDK1.4或1.3上部署的版本.它可以很好的支持1.5新增的特性,如自动装箱,泛型,动态注解,枚举,变长参数,遍历循环,静态导入这些语法,甚至还可以支持JDK1.5中新增的集合改进,并发包以及泛型,注解等的反射操作.

3.Retrotranslator只能模拟JDK升级功能中的前两类(在编译层面的改进和对Java API的代码增强).
3.1 模拟在编译层面的改进:Retrotranslator使用ASM框架直接对字节码进行处理.虽然字节码指令的数量没有变化,但是元信息和一些支持的语法需要改进.如枚举类型,在JDK1.5中,增加了enum关键字,但是Constant_Class_info的语义并没有发生变化.貌似Enum跟接口和类是一个层次,实际上javac编译器做出来的假象.从字节码的角度上,枚举仅仅是继承于java.lang.Enum,自动生成了values和valuesOf()方法的普通java类而已.
Retrotranslator对枚举类型的处理:把枚举类型的父类从java.lang.Enum替换为它运行时类库中包含的"net.sf.retrotranslator.runtime.java.lang.Enum_",然后再在类和字段的方位标志access_flag中抹去ACC_ENUM标志位(当然,net.sf.retrotranslator.runtime.java.lang.Enum_需要重写values()和valuesOf()
方法).

3.2模拟在Java API的代码增强:在JDK1.5中,引入了并发包(java.util.concurrent包),它实际上是由多线程大师Doug Lea开发的一套并发包,在JDK1.5之前就存在,在引入JDK的时候,作者和JDK开发团队共同做了一些改进而已.所以,要在旧版本的JDK中实现这部分功能,只需要独立引入类库就能实现(如引入backport-util-concurrent.jar).

你可能感兴趣的:(Retrotranslator:java逆向移植工具)