Определение класса, в то время как JAVA-приложение работает

Со входом "BBBB", который занимал 5 байтов в памяти - четыре буквы и терминал \ 0 - переменная B расширяется до A. Тогда терминал \ 0 в B становится первым байтом A, а затем A теперь является пустой строкой. Сын, когда вы согласны с B по A в AB, результат будет B.

17
задан Blaisorblade 20 December 2009 в 18:32
поделиться

11 ответов

Да, теоретически ваш файл класса представляет собой байт-код, который в конце является байтом массив! Затем вы можете использовать метод defineClass (String, byte [], int, int), чтобы получить экземпляр класса, который можно использовать для создания экземпляров объектов с помощью отражения.

На практике вы можете использовать что-то вроде CGLib или javaassist .

11
ответ дан 30 November 2019 в 14:12
поделиться

Вы можете динамически генерировать классы, используя ASM

2
ответ дан 30 November 2019 в 14:12
поделиться

Вы можете сделать это, записав код для вашего нового класса в файл, затем вызвав компилятор Java для этого файла и используя загрузчик классов для динамической загрузки этого класса в ваше работающее приложение. Apache Tomcat делает это для своих страниц JSP; он берет код, вносит в него некоторые изменения, оборачивает его в блок try / catch в середине класса, который затем записывает в файловую систему, компилирует его и использует загрузчик классов для получения и предъявления иска для обслуживания запросов.

1
ответ дан 30 November 2019 в 14:12
поделиться

Конечно, это возможно. См., Например, эту статью .

1
ответ дан 30 November 2019 в 14:12
поделиться

Возможно, самым простым решением (с точки зрения отсутствия дополнительных библиотек) будет использование API-компилятора Java ], который поставляется с Java 6. Вы просто можете сгенерировать .java, скомпилировать и затем выполнить Class.forName ().

1
ответ дан 30 November 2019 в 14:12
поделиться

Возможно, немного излишним, Apache BCEL (Byte Code Engineering Library) может использоваться для создания файлов класса во время выполнения.

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

0
ответ дан 30 November 2019 в 14:12
поделиться

Да, это возможно.

Вы можете создавать классы с помощью Javassist во время выполнения, определяя тело класса и заставляя javassist компилировать ваш новый класс.

Javassist имеет собственный компилятор, который создает байт-код на основе определения вашего класса. У него есть некоторые особые способы обработки вещей, но использовать эту библиотеку очень просто и интуитивно понятно.

Javassist используется в JBoss, и я думаю, что это хорошая справка:)

То же самое можно достичь с помощью BCEL , однако это намного сложнее (но таким образом вы имеете больший контроль над тем, что генерируется).

0
ответ дан 30 November 2019 в 14:12
поделиться

Возможно, вы сделаете что-то подобное с JRuby, JPython или Groovy, если вы должен.

Если вы чувствуете себя особенно мазохистски, вы можете взглянуть на BCEL .

0
ответ дан 30 November 2019 в 14:12
поделиться

Если вы хотите Java и метапрограммирование, используйте Groovy .

0
ответ дан 30 November 2019 в 14:12
поделиться

ASM , я полагаю, является библиотекой байт-кода самого низкого уровня для Java. Это делает его очень сложным, но и очень мощным. Я рекомендую прочитать документацию ASM ( PDF ), чтобы действительно понять, как работает генерация байт-кода в Java. В этой документации также объясняется, как загружать байт-код в загрузчик классов (еще одна сложная тема для правильной работы).

После этого вы можете использовать одну из библиотек более высокого уровня, если она облегчит вашу жизнь, и понять, что они делают. Для многих случаев, таких как генерация прокси, CGLIB полезен и прост в использовании. Для большей мощи многие упоминали Javassist (я не использовал его - CGLIB и ASM были хороши для меня).

0
ответ дан 30 November 2019 в 14:12
поделиться

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

0
ответ дан 30 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

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