2009-11-04 13 views

ответ

5

Вы не можете сделать это, используя отражение. Вам нужна библиотека манипуляции байткодом, например Jakarta BCEL.

+0

Можете ли вы добавить примеры – Switch

+0

В учебнике есть хороший пример. Взгляните: http://jakarta.apache.org/bcel/manual.html#HelloWorldBuilder. –

0

Конечно, есть. Первоначально вам нужен экземпляр java.lang.Class для целевого класса, который вы хотите создать. В зависимости от вашей структуры это может быть либо передано вызывающим абонентом (если они предоставляют конкретный класс, который они хотят создать), либо вы можете статически получить доступ к переменной класса (например, MyFooImpl.class).

Самый простой способ - позвонить Class.newInstance(). Это вызывает конструктор no-arg по умолчанию (предполагается, что для класса есть один, если он не генерирует исключение).

Если вам нужно вызвать конкретный конструктор с некоторым аргументом, вам нужно позвонить Class.getConstructor(), чтобы получить экземпляр конструктора, который вы можете затем позвонить newInstance.

Во всех случаях вам нужно иметь дело с исключениями отражения, которые вы не получили бы, если бы вызывали конструктор напрямую.

большое изменение: Я предполагаю, что ваш вопрос касался создания экземпляров класса через отражение. Однако я начинаю думать, что вы спрашиваете о , определяющем новых классов во время выполнения. Если это так, то размышление не поможет вам здесь - вам нужно будет запрограммировать компилятор программно, что, я считаю, можно сделать, но я не на 100% на детали. Я думаю, вам также придется пройти через несколько обручей, чтобы получить ClassLoader, чтобы забрать свой новый класс.

+0

Да, но это для существующего класса для создания объектов из него, я хочу создать класс. – Switch

0

Вы можете создать строку исходного кода и скомпилировать ее в файл класса с помощью Janino.

3

Стандартный Java API предоставляет набор статических методов, который позволяет динамически создавать класс, реализующий один (или многие) интерфейсы. Эти методы являются частью класса java.lang.reflect.Proxy.

0

Как уже упоминалось, нет возможности создавать новые классы во время работы с использованием отражения. Одна библиотека, которую я знаю, используется разными издевательскими библиотеками, а именно cglib.

3

Для чего вам это нужно?

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

Если у вас есть класс, который вы тоже добавляете, вы можете обнаружить, что Aspect-oriented programming - это то, что вы действительно после.

Если у вас есть интерфейс, который вы хотите динамически реализовать (как отправлено barjak), то вы хотите это java.lang.reflect.Proxy. Это не позволяет создавать «код» во время выполнения, а скорее позволяет связать существующий код с интерфейсом.

Наконец-то (в три, я знаю) вы на самом деле строите случайные классы во время выполнения. Вам понадобится что-то вроде cglib или BCEL. Хотя бывают случаи, когда это требуется, ИМО редко.

Еще один вариант заключается в том, что вы не действительно необходимо время выполнения, но скорее время сборки.В этом случае вы могли бы использовать annotations и apt (Java 5)/Processor (Java 6).

+0

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

+1

Я бы также добавил API-интерфейсы сценариев (http://java.sun.com/javase/6/docs/api/), добавленные в 1.6, но в конечном итоге ваше решение, скорее всего, будет руководствоваться тем, как поведение класса, будет определено. –

+0

Я забыл о скриптовом API, но да, это хороший момент. –

0

вы можете использовать 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

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