Как создать байт-код и сохранить в.файл класса?

у меня странное требование.

я:

  1. список некоторых имен методов.
  2. имена и типы параметров вышеуказанных методов.
  3. функциональность вышеуказанных методов. Это выглядит следующим образом: Для каждого параметра метод преобразует его в строку с помощью toString и получает массив строк. К этому массиву метод применяет функцию foo. Функция foo принимает в качестве входных данных a String [] тип и выходы String. Методы возврата, что foo возвращает. fooкод задается внутри объекта Java и должен быть доступен как черный ящик.

информация в 1. и 2. может быть в текстовом или XML-файле. Для этой цели мы можем считать его доступным внутри объекта Java любым способом, который мы выберем.

задача-создать .class файл (т. е. байт-код), который реализует эти методы и может быть запущен на JVM.

Я думаю, эта библиотека ассемблеров было бы одним из способов сделать это. Может ли кто-нибудь предложить более простой способ?

[EDIT:] я могу придумать еще один способ: сначала создайте .java файл, а затем скомпилировать его, чтобы получить .

[контекст:] я должен сделать это для нескольких сотен методов. Мне нужен ярлык, чтобы я мог автоматизировать свою работу, а не вручную писать код.

3 ответов


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

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


вот список открытый исходный байт-код библиотеки: http://java-source.net/open-source/bytecode-libraries

посмотреть Javassist.


Я видел, как вы ответили на мой комментарий, но мне все еще не ясно, почему вы хотите создать код, который затем будет упакован в банку, просто введите его:)

теперь, если вы хотите api typesafe со всеми методами, имеющими одинаковое поведение, вы можете предоставить динамический прокси для данного интерфейса (это оставляет вас с вопросом о том, как создать интерфейс :)

вот пример, где все вызовы всех методов MyInterface будут обрабатываться методом invoke (просто добавьте методы в интерфейс, чтобы проверить его)...

package test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test {

interface MyInterface {

    String methodOne(String s);

    String methodTwo(String s, Integer i);
}

static MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
        MyInterface.class.getClassLoader(),
        new Class[] { MyInterface.class }, new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {  
                StringBuilder result = new StringBuilder();
                for (Object arg : args) {
                    result.append(arg.toString());
                }
                return result.toString();
            }
        });

public static void main(String[] args) {
    System.out.println(proxy.methodOne("hello"));       
    System.out.println(proxy.methodTwo("world", 5));

}   

}