Генерация .class файл для JVM

Это - фантастическая книга, которую раньше изучали мои маленькие братья:

http://pine.fm/LearnToProgram/

, Конечно, самая важная вещь состоит в том, чтобы сразу запуститься на реальной, полезной программе некоторого вида после окончания книги.

5
задан Raghav Bali 25 November 2009 в 16:07
поделиться

5 ответов

Пример использования библиотеки байт-кода ASM , преобразованной для работы с .NET с использованием компилятора IKVM Java-to-.NET :

привет. 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);
        }
    }
}

команды:

$ 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
4
ответ дан 14 December 2019 в 13:39
поделиться

Вы смотрели BCEL?

http://en.wikipedia.org/wiki/Byte_Code_Engineering_Library

Теперь он связан с JRE.

0
ответ дан 14 December 2019 в 13:39
поделиться

Вы можете посмотреть библиотеку байт-кода ASM . Это довольно популярно. Его используют многие языки JVM: Clojure, Groovy, Jython, JRuby.

Но я согласен с другими почтовыми серверами, что может быть проще сгенерировать исходный код Java и скомпилировать его с помощью javac , чтобы получить файл .class. Во многом зависит от того, что вам нужно сделать.

2
ответ дан 14 December 2019 в 13:39
поделиться

Сохраните следующее в Simple.java и выполните javac Simple.java из командной строки (при условии, что у вас установлен JDK)

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

Это по крайней мере стандартный способ создания простого файла класса;)

0
ответ дан 14 December 2019 в 13:39
поделиться

Серьезный ответ.

Я бы автоматически сгенерировал код Java и использовал компилятор Java для генерации файла класса. Это выглядит намного проще, чем сражаться с BCEL. Хотя бы потому, что проще написать алгоритм на «более высоком» языке, чем на Java Byte Code.

Подойдет любой другой язык программирования, который производит байтовый код, но я полагаю, что Java - один из самых простых подходов.

Что касается ваших вопросов,

(1) Да, некоторые метаданные довольно статичны. В Википедии есть хороший обзор формата файла классов

(2) Да, файл классов является «двоичным». Не существует алфавитно-цифрового языка (например, ассемблера) для байт-кода Java (по крайней мере, я не слышал ни о каком таком инструменте, javap может печатать байт-код, читаемый, но пути назад нет)

Изменить

Тем не менее трудно угадать, то, что вы действительно хотите сделать, но на всякий случай вы хотите написать файл класса вокруг арифметического выражения, которое может вычислять это арифметическое выражение в виртуальной машине Java, тогда вы действительно можете начать с создания файла класса шаблона.

В этом случае я бы закодировал этот «оценщик» на Java и тестировал его, пока он не оценил все допустимые входные данные. Я бы использовал частное поле для хранения выражения, инициализированного фиктивным выражением.

Файл класса моего Java-кодированного оценщика был бы идеальным шаблоном для генерации «динамического» класса - мне просто нужно было узнать, как « замените фиктивное выражение на реальное, воссоздайте действительный файл класса (возможно, вам придется изменить некоторые указатели из-за разной длины строк), и оно должно работать.

Даже если это предположение полностью неверно,

0
ответ дан 14 December 2019 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: