Есть ли способ для создания классов Java @ во время выполнения (классы методов п переменных), с помощью Java Reflection APIкласса во время выполнения
ответ
Вы не можете сделать это, используя отражение. Вам нужна библиотека манипуляции байткодом, например Jakarta BCEL.
Конечно, есть. Первоначально вам нужен экземпляр java.lang.Class для целевого класса, который вы хотите создать. В зависимости от вашей структуры это может быть либо передано вызывающим абонентом (если они предоставляют конкретный класс, который они хотят создать), либо вы можете статически получить доступ к переменной класса (например, MyFooImpl.class
).
Самый простой способ - позвонить Class.newInstance(). Это вызывает конструктор no-arg по умолчанию (предполагается, что для класса есть один, если он не генерирует исключение).
Если вам нужно вызвать конкретный конструктор с некоторым аргументом, вам нужно позвонить Class.getConstructor(), чтобы получить экземпляр конструктора, который вы можете затем позвонить newInstance.
Во всех случаях вам нужно иметь дело с исключениями отражения, которые вы не получили бы, если бы вызывали конструктор напрямую.
большое изменение: Я предполагаю, что ваш вопрос касался создания экземпляров класса через отражение. Однако я начинаю думать, что вы спрашиваете о , определяющем новых классов во время выполнения. Если это так, то размышление не поможет вам здесь - вам нужно будет запрограммировать компилятор программно, что, я считаю, можно сделать, но я не на 100% на детали. Я думаю, вам также придется пройти через несколько обручей, чтобы получить ClassLoader, чтобы забрать свой новый класс.
Да, но это для существующего класса для создания объектов из него, я хочу создать класс. – Switch
Вы можете создать строку исходного кода и скомпилировать ее в файл класса с помощью Janino.
Стандартный Java API предоставляет набор статических методов, который позволяет динамически создавать класс, реализующий один (или многие) интерфейсы. Эти методы являются частью класса java.lang.reflect.Proxy.
Как уже упоминалось, нет возможности создавать новые классы во время работы с использованием отражения. Одна библиотека, которую я знаю, используется разными издевательскими библиотеками, а именно cglib.
Для чего вам это нужно?
Устный перевод вопроса в очень рыхлой усадьбе Я могу представить четыре возможных варианта.
Если у вас есть класс, который вы тоже добавляете, вы можете обнаружить, что Aspect-oriented programming - это то, что вы действительно после.
Если у вас есть интерфейс, который вы хотите динамически реализовать (как отправлено barjak), то вы хотите это java.lang.reflect.Proxy
. Это не позволяет создавать «код» во время выполнения, а скорее позволяет связать существующий код с интерфейсом.
Наконец-то (в три, я знаю) вы на самом деле строите случайные классы во время выполнения. Вам понадобится что-то вроде cglib или BCEL. Хотя бывают случаи, когда это требуется, ИМО редко.
Еще один вариант заключается в том, что вы не действительно необходимо время выполнения, но скорее время сборки.В этом случае вы могли бы использовать annotations и apt
(Java 5)/Processor
(Java 6).
+1 - вот-вот должен был сказать то же самое, генерировать байт-код должен только действительно понадобиться в очень немногих ситуациях. –
Я бы также добавил API-интерфейсы сценариев (http://java.sun.com/javase/6/docs/api/), добавленные в 1.6, но в конечном итоге ваше решение, скорее всего, будет руководствоваться тем, как поведение класса, будет определено. –
Я забыл о скриптовом API, но да, это хороший момент. –
вы можете использовать javassist. здесь sudo код
javassist.ClassPool pool = new ClassPool(true);
CtClass bclass = pool.makeClass("brandnewclass);
bclass.addConstructor(CtNewConstructor.defaultConstructor(bclass));
CtClass[] fieldclasses = new CtClass[fields.length];
CtClass serClass = pool.get(Serializable.class.getName());
bclass.addInterface(serClass);
Класс clazz = pool.loadClass ("className"); obj = clazz.newInstance();
Используйте отражение, чтобы извлечь значения из существующего класса и присвоить значения новому классу. надеюсь, что это поможет. Gopi
- 1. Расширение класса во время выполнения
- 2. Расширение класса во время выполнения
- 3. Расширение класса во время выполнения
- 4. Заменить реализацию класса COM во время выполнения
- 5. члены класса Создание во время выполнения - C#
- 6. Генерация класса из XSD во время выполнения
- 7. C# Изменение метода класса во время выполнения
- 8. Измените метод класса C# во время выполнения
- 9. Как читать атрибут класса во время выполнения?
- 10. ClassNotFoundException для класса BrowserView во время выполнения
- 11. Создание объекта класса во время выполнения Python
- 12. Выбор производного класса во время выполнения
- 13. Проверка класса Scala во время выполнения
- 14. Получите общий тип класса во время выполнения
- 15. Как изменить определение класса во время выполнения?
- 16. Динамическая загрузка класса во время выполнения
- 17. Изменение суперкласса класса во время выполнения
- 18. Изменение типа класса во время выполнения
- 19. Наследуйте новый метод класса во время выполнения
- 20. Создание класса динамически во время выполнения
- 21. Знать размер класса во время выполнения
- 22. Создание класса во время выполнения в Android
- 23. Установить свойство класса во время выполнения
- 24. Определение производного типа класса во время выполнения
- 25. Найти зависимости java-класса во время выполнения
- 26. Динамический выбор класса во время выполнения
- 27. Перечисление событий класса во время выполнения
- 28. php создать метод класса во время выполнения
- 29. Обнаружение нового класса Java во время выполнения
- 30. Objective-C: переменная класса во время выполнения?
Можете ли вы добавить примеры – Switch
В учебнике есть хороший пример. Взгляните: http://jakarta.apache.org/bcel/manual.html#HelloWorldBuilder. –