Как создать байт-код и сохранить в.файл класса?
у меня странное требование.
я:
- список некоторых имен методов.
- имена и типы параметров вышеуказанных методов.
- функциональность вышеуказанных методов. Это выглядит следующим образом:
Для каждого параметра метод преобразует его в строку с помощью
toString
и получает массив строк. К этому массиву метод применяет функциюfoo
. Функцияfoo
принимает в качестве входных данных aString []
тип и выходы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));
}
}