Pregunta

Estoy trabajando en un proyecto que me obliga a generar un java ".class" archivo en el camino que puede ser compilado más adelante en la JVM. Después de aprender y trabajar con MSIL (Microsoft IL), que es también un lenguaje de programación basado en pila intermedia, los siguientes son los problemas que estoy enfrentando:

  1. En comparación con la IL (para C # o VB) el código de bytes de Java en el archivo ".class" contiene información de una manera estructurada y por lo que pude comprender el archivo, que contiene los metadatos aparte de los datos del programa, es ¿¿es verdad?? ¿Puedo generar la misma en un modelo de formulario para cada archivo de clase ??
  2. ¿Es obligatorio para generar el archivo de clase en binario ??

Me he referido a "Programación para la máquina virtual de Java ™ Por Joshua Engel" pero no ha servido a mi propósito como ya he aprendido sobre el conjunto de instrucciones JVM.

Puede alguien por favor me ayude con esto ?? Toda la ayuda será muy apreciada. Un ejemplo para la generación de un archivo de clase sencilla sería de gran ayuda ya que no podía localizar un solo 1 todavía.

¿Fue útil?

Solución

Ejemplo usando el href="http://asm.ow2.org/" rel="nofollow noreferrer"> ASM biblioteca convierte en trabajo con .NET utilizando el IKVM Java-to-.NET compilador :

Hello.cs:

using System;
using System.IO;
using org.objectweb.asm;

namespace test.helloWorld
{
    public class helloDump
    {

        public static byte[] dump ()
        {

            ClassWriter cw = new ClassWriter(0);
            MethodVisitor mv;

            cw.visit(Opcodes.__Fields.V1_6, Opcodes.__Fields.ACC_PUBLIC + Opcodes.__Fields.ACC_SUPER, "hello", null, "java/lang/Object", null);

            mv = cw.visitMethod(Opcodes.__Fields.ACC_PUBLIC, "<init>", "()V", null, null);
            mv.visitCode();
            mv.visitVarInsn(Opcodes.__Fields.ALOAD, 0);
            mv.visitMethodInsn(Opcodes.__Fields.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
            mv.visitInsn(Opcodes.__Fields.RETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();

            mv = cw.visitMethod(Opcodes.__Fields.ACC_PUBLIC + Opcodes.__Fields.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
            mv.visitCode();
            mv.visitFieldInsn(Opcodes.__Fields.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
            mv.visitLdcInsn("Hello World!");
            mv.visitMethodInsn(Opcodes.__Fields.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
            mv.visitInsn(Opcodes.__Fields.RETURN);
            mv.visitMaxs(2, 1);
            mv.visitEnd();

            cw.visitEnd();

            return cw.toByteArray();
        }

        public static void Main(string[] args)
        {
            FileStream helloWorldFile = new FileStream("hello.class", FileMode.Create);
            byte[] helloWorldClass = dump();
            helloWorldFile.Seek(0, SeekOrigin.Begin);
            helloWorldFile.Write(helloWorldClass, 0, helloWorldClass.Length);
        }
    }
}

comandos:

$ ikvmc -out:org.objectweb.asm.dll -target:library -version:3.2.0.0 asm-3.2.jar
$ mcs -r:org.objectweb.asm.dll  hello.cs
$ mono hello.exe
$ ls hello.class
$ java hello

Otros consejos

Guarde lo siguiente en Simple.java y hacer javac Simple.java desde la línea de comandos (suponiendo que tiene instalado el JDK)

public class SimpleJava {
  public static main(String[] args) {
    System.out.println("Big Sorry, couldn't stop myself ;-)");
  }
}

Eso es, al menos, una forma estándar para generar un archivo de clase simple;)

respuesta seria.

Me había auto-generar código Java y utiliza el compilador de Java para generar el archivo de clase. Este aspecto mucho más fácil que luchar contra BCEL. Al menos porque es más fácil de código de un algoritmo en un lenguaje 'más alto' que en Java de código de bytes.

Cualquier otro lenguaje de programación que produce el código de bytes hará aswell, pero supongo que Java es uno de los enfoques más fáciles.

Y llegando a sus preguntas,

(1) Sí, algunos metadatos es bastante estático. Wikipedia tiene una buena visión general del formato archivo de clase

(2) Sí, el archivo de clase es 'binario'. No hay ninguna alfanumérico idioma (como ensamblador) para Java de código de bytes (por lo menos no he oído hablar de ninguna de estas herramientas, javap puede imprimir el código de bytes de lectura pero no hay manera de volver)

Editar

Todavía difícil de adivinar, lo que realmente quiere hacer, pero por si acaso, que desea escribir un archivo de clase en torno a una expresión aritmética que puede evaluar esa expresión aritmética en una máquina virtual de Java, entonces realmente podría comenzar con la creación de una archivo de clase de plantilla.

En ese caso, me gustaría código Este 'evaluador' en Java y probarlo hasta que evalúa todas las entradas válidas. Que haría uso de un campo privado para mantener la expresión, inicializado con una expresión ficticia.

El archivo de clase de mi evaluador codificado en Java sería una plantilla perfecta para la generación de la clase 'dinámico' - sólo tenía que encontrar la manera de 'reemplazar' la expresión maniquí con una de verdad, vuelva a crear archivo de clase válida (puede que tenga que ajustar algunos indicadores debido a las diferentes longitudes de cuerda) y debería funcionar.

Aunque esta suposición es totalmente erróneo, puede servir como estudio de caso y puede ayudarle en su camino:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top