2015-09-04 3 views
1

Я хотел бы работать с классом, который доступен только в моей среде выполнения, и у меня нет файлов .java или .class. Единственный способ использовать его AFAIK - это отражение.Генератор кода оболочки оболочки Java?

Что я уже сделал, это написать небольшую программу, чтобы получить экземпляр Class моего целевого класса, перебрать его общедоступные методы/поля и получить их подпись (аналогично this program). Это даст мне скелет исходного файла .java. Затем я вручную заполнил тела этих методов, чтобы они называли реальные методы, используя отражение. Так сделанный Java-файл скомпилирован javac вместе с моим кодом пользователя. Таким образом, я мог бы использовать целевой класс, не заполняя мой код с помощью методов/полей.

Вот мои вопросы:

  • Есть ли определенный срок за то, что я пытаюсь сделать? («Генератор кода оболочки отражения Java» может быть?)
  • Есть ли инструмент, который автоматизирует задачу, которую я делал вручную выше?
  • Если нет, то каковы проблемы при создании такого инструмента?
+2

«У меня нет файлов .class». Это звучит маловероятно. Вы строите класс в памяти, или как у вас нет файла класса? – Kayaman

+0

Я бы сказал, что вы пытаетесь написать мостовой объект, который использует отражение для его создания. –

+0

Звучит так, как будто вы создаете [Прокси] (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html) – OldCurmudgeon

ответ

1

Что вы пытаетесь сделать, это прокси-класс. Множество рамок используют его для ввода некоторой автоматизации, транзакций и т. Д. Java EE, Spring, например.

Существует 2 способа: Простой с java.lang.reflect.Proxy, но он имеет ограничения: ваш класс должен реализовывать интерфейс, и может быть вызван только метод в интерфейсе.

Более сложный подход основан на генерации байт-кода, вы можете использовать структуру Mockito, которая генерирует все, что вам нужно: оно предназначено для тестов, но может также использоваться для создания любого класса, который переопределяет существующий.

Я могу завершить свой ответ на примере, если вам это нужно.

Смежные вопросы