Как я могу динамически создать новый файл .java из программы Java? - PullRequest
2 голосов
/ 22 января 2011

Я хочу создать одну .java из программы Java. Когда я запускаю программу, автоматически создается один файл Java в моем проекте, а также создается некоторая переменная времени выполнения (динамическая) в этом файле. Как я могу это сделать?

Я знаю, для этого мне нужно использовать Reflection API, например Class и Method, но каковы методы в Class и Method, чтобы сделать это?

Ответы [ 4 ]

1 голос
/ 22 января 2011

Очевидно, вы хотите создать новый класс во время выполнения и использовать его. Вы можете создать .java файл, скомпилировать его и загрузить из пользовательского загрузчика классов, но это, вероятно, не самая лучшая / самая легкая вещь, которую можно сделать. Вот несколько решений:

  1. Прежде всего, если вы хотите расширить интерфейс, вы можете использовать Proxy из Java Reflection API.
  2. Если вы хотите расширить класс, а не реализовать интерфейс или создать класс, вам нужно использовать библиотеку для создания байт-кода. Вы можете найти их несколько на http://www.java -opensource.com / open-source / bytecode-library.html . Из этих библиотек мне нравится javassist в основном потому, что, насколько мне известно, это единственная библиотека, позволяющая вводить код Java напрямую, а не байт-код.
  3. Последнее решение должно заключаться в использовании такой среды, как Groovy или BSH, для интерпретации псевдо-Java-кода.
1 голос
/ 22 января 2011

Вы не можете создавать новые классы или методы, используя API отражения.Они не предназначены для этого.(API Class и Method предназначены для динамического выполнения операций с экземплярами объектов.)

Если вы хотите создать новый код на лету, для этого есть два основных подхода:

  1. Сгенерируйте исходный код Java, запишите его в файл, используйте компилятор Java, чтобы скомпилировать его в файл байт-кода, а затем загрузите байт-коды.(Существуют стандартные API для запуска компилятора Java в JVM работающего приложения.)

  2. Используйте BCEL или эквивалентный для создания файла байт-кода с нуля, изатем загрузите байт-коды.

Оба подхода сложны и требуют больших вычислительных ресурсов.Подход BCEL особенно сложен, потому что вам нужно много понимать о JVM, чтобы выполнять эту работу.

0 голосов
/ 22 января 2011

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

Если вам нужна эта функциональность в Java, вам нужно использовать groovy. Groovy - это динамический язык, который может работать в Java JVM. Вам нужно проверить Expandos в groovy. (Конечно, он не будет создавать файл .java).

0 голосов
/ 22 января 2011

Нет, вы не можете создавать новые .java файлы, используя Reflection.Возможно, вы могли бы создать новый класс и использовать этот класс во время выполнения, но вы не можете записать этот класс в файл в виде исходного файла .java.например.Эта структура решает этот тип проблем IIRC.

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