Со входом "BBBB"
, который занимал 5 байтов в памяти - четыре буквы и терминал \ 0 - переменная B
расширяется до A
. Тогда терминал \ 0 в B
становится первым байтом A
, а затем A
теперь является пустой строкой. Сын, когда вы согласны с B
по A
в AB
, результат будет B
.
Да, теоретически ваш файл класса представляет собой байт-код, который в конце является байтом массив! Затем вы можете использовать метод defineClass (String, byte [], int, int), чтобы получить экземпляр класса, который можно использовать для создания экземпляров объектов с помощью отражения.
На практике вы можете использовать что-то вроде CGLib или javaassist .
Вы можете динамически генерировать классы, используя ASM
Вы можете сделать это, записав код для вашего нового класса в файл, затем вызвав компилятор Java для этого файла и используя загрузчик классов для динамической загрузки этого класса в ваше работающее приложение. Apache Tomcat делает это для своих страниц JSP; он берет код, вносит в него некоторые изменения, оборачивает его в блок try / catch в середине класса, который затем записывает в файловую систему, компилирует его и использует загрузчик классов для получения и предъявления иска для обслуживания запросов.
Возможно, самым простым решением (с точки зрения отсутствия дополнительных библиотек) будет использование API-компилятора Java ], который поставляется с Java 6. Вы просто можете сгенерировать .java, скомпилировать и затем выполнить Class.forName ().
Возможно, немного излишним, Apache BCEL (Byte Code Engineering Library) может использоваться для создания файлов класса
во время выполнения.
Хотя я сам не пробовал, возможно, тогда можно было бы создать класс, загрузить его и создать экземпляр это во время выполнения.
Да, это возможно.
Вы можете создавать классы с помощью Javassist во время выполнения, определяя тело класса и заставляя javassist компилировать ваш новый класс.
Javassist имеет собственный компилятор, который создает байт-код на основе определения вашего класса. У него есть некоторые особые способы обработки вещей, но использовать эту библиотеку очень просто и интуитивно понятно.
Javassist используется в JBoss, и я думаю, что это хорошая справка:)
То же самое можно достичь с помощью BCEL , однако это намного сложнее (но таким образом вы имеете больший контроль над тем, что генерируется).
Возможно, вы сделаете что-то подобное с JRuby, JPython или Groovy, если вы должен.
Если вы чувствуете себя особенно мазохистски, вы можете взглянуть на BCEL .
Если вы хотите Java и метапрограммирование, используйте Groovy .
ASM , я полагаю, является библиотекой байт-кода самого низкого уровня для Java. Это делает его очень сложным, но и очень мощным. Я рекомендую прочитать документацию ASM ( PDF ), чтобы действительно понять, как работает генерация байт-кода в Java. В этой документации также объясняется, как загружать байт-код в загрузчик классов (еще одна сложная тема для правильной работы).
После этого вы можете использовать одну из библиотек более высокого уровня, если она облегчит вашу жизнь, и понять, что они делают. Для многих случаев, таких как генерация прокси, CGLIB полезен и прост в использовании. Для большей мощи многие упоминали Javassist (я не использовал его - CGLIB и ASM были хороши для меня).
Здесь недавно возник вопрос относительно компиляции в памяти , которая должна дать вам несколько советов о том, что делать после того, как вам удалось сгенерировать исходный код.