descargar - java 7 download
Compilando Java 7 a Java 6 (4)
Soy consciente de que las funciones de tiempo de ejecución de Java 7 no están disponibles con Java 6, pero como no se ha agregado ningún nuevo código de bytes, el nuevo código de bytes invokedynamic
solo es relevante para lenguajes que no sean Java, me preguntaba qué tan difícil sería convertir Código fuente de Java 7 (nueva declaración de switch
, operador de diamante) a Java 6 puro (es decir, para poder comenzar a convertir la fuente a Java 7 sin perder la compatibilidad de Java 6).
Cualquier punteros?
Marque una salida de archivo .class de Java 7 javac con la versión 1.6.0 (es decir, 0x32)
printf "/x00/x00/x00/x32" |dd of=Example.class seek=4 bs=1 count=4 conv=notrunc
(según http://en.wikipedia.org/wiki/Java_class_file#General_layout )
Si pone eso (usando $ 1 para el nombre de archivo) en j6patch
, puede hacer todos los archivos de clase con:
find . -name /*.class |xargs -I {} ./j6patch {}
Utilicé esto en una base de código grande (~ 4.8 MB jar) e incluso usé RetroTranslator
en java 6 jar para que las funciones de lenguaje Java 7 puedan usarse en una aplicación que se ejecute en Java 5. También el compilador Java 7 ( javac
) hace muchas javac
de optimizaciones adicionales (por ejemplo, análisis de escape) que mejoran notablemente el rendimiento.
El uso de RetroTranslator
con los tarros de tiempo de ejecución RetroTranslator
-verify -target 1.5
y JRE 1.6 permite verificar que no se utilizan funciones de tiempo de ejecución de Java 7.
Por lo que sé, no hay una solución para este problema en este momento. La mejor opción sería extender el retrotranslator para tratar con las construcciones de Java 1.7. El operador de diamante debería ser muy fácil, ya que no requiere ninguna modificación del código de bytes.
Su declaración "no se ha agregado un nuevo código de bytes" no es correcta: hay un nuevo código de bytes invocado y, lo que es más importante, hay varios casos en los que el código de bytes generado no será válido para 1.6 JRE, por lo que el retrotranslator tendría que arreglarlo.
Probablemente sea un trabajo, pero prueba esto:
Agregue el compilador Java de Eclipse a su ruta de clases. Está en el complemento org.eclipse.jdt.core
(busque org.eclipse.jdt.core_*.jar
en la carpeta plugins
).
Este JAR contiene el compilador y el analizador. Puede invocar el analizador usted mismo y luego usar el ASTVisitor
para atravesar el árbol de análisis.
A continuación, puede modificar el árbol y crear el nuevo código fuente a partir de este que puede compilar como de costumbre.
Incluso podría ser posible "preprocesar" el árbol AST antes de que el compilador genere un código de bytes; Esto le ahorraría el paso "escribir las fuentes de nuevo en el disco y compilarlas desde allí".
Tiene razón en que Java no utiliza la instrucción invokedynamic, sin embargo, hay otros cambios relacionados que se pueden usar en Java. Invokedynamic se basa en un nuevo ''Mecanismo de Enlace Dinámico - Manejadores de Métodos'' para el cual también hay algunos cambios en la instrucción invokevirtual. Puede encontrar más detalles en este artículo en la sección ''Un nuevo mecanismo de vinculación dinámica: Manejadores de métodos''.
Los controles de método también proporcionan una alternativa más rápida a la reflexión y, por lo tanto, son útiles en Java. No sería posible convertir el código usando los manejadores de métodos a Java 6 ya que la función se basa en Java 7 VM.