2016-04-10 4 views
-1

У меня есть один класс с именем Class1. Я не знаю, что такое поля такого класса, но я знаю , что есть поля в таком классе, которые используют аннотацию @Inject, ведьма означает, что такие поля должны иметь инстанции. Я знаю, что класс имеет контроллер по умолчанию. Я использую такой контроллер для создания экземпляра класса с помощью метода newInstance:Java EE CDI Manual Injection

Object class1Object = Class.forName("Class1").newInstance(); 

Проблемы заключается в том, что, Зависимости «Class1» не впрыскивает в поле экземпляра объекта, и я понимаю, что его совершенно нормален, как я 'm экземпляр класса вручную. Мне нужно, чтобы эти зависимости были введены, поэтому мне нужен магический метод для этого:

CDI.injectAllDependencies(class1Object); 

Любые идеи? Пожалуйста, не ожидайте, чтобы я прекратил экземпляр класса вручную. Моя ситуация требует такого подхода. Заранее спасибо.

+0

Нет. Это может быть вариант, если он работает так, как кажется. Он создает экземпляр класса Class1 и вводит все его зависимости. Я прав? –

+0

Есть ли способ зарегистрировать его программно, а не beans.xml? –

ответ

0

Даже если я не рекомендую его, вы можете получить все поля аннотированные с @Inject с помощью отражения:

for (Field field : Class.forName("Class1").getFields()) { 
    if (field.isAnnotationPresent(Inject.class)) { 
     //do all your nasty stuff here 
    } 
} 

Если после этого вы хотите, чтобы получить экземпляр типа месторождения с CDI вы можете спросите у BeanManager. Посмотрите на http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup. После того, как у вас есть экземпляр, вы можете использовать отражение, чтобы установить поле в экземпляр, как описано в поле API (https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#set-java.lang.Object-java.lang.Object-)

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