2014-09-03 4 views
0

Weld 컨텍스트를 사용하여 리플렉션을 통해 객체를 만드는 데 문제가 있습니다.Weld-SE 컨텍스트가있는 Java reflection 인스턴스

외부 파일에서 클래스 및 해당 구성을로드하고 있습니다.

처럼 내 코드가 보이는 단순화 :이 클래스의 인스턴스를 만드는거야 다음

final Class<?> moduleClass = Class.forName(properties.getProperty("className")); 

final Constructor<?> constructor = moduleClass.getDeclaredConstructor(); 
module = (Module) constructor.newInstance(); 

모듈 클래스 :

@ModuleImpl 
public class ExampleModule extends AbstractModule (implements Module interface) { 

    @Inject 
    private Test test; 

모듈이 성공적으로 생성되지만, 그것을 Test 클래스를 주입하기위한 컨텍스트를 용접하지 않았습니다. 그리고 올바른 방법을 찾을 수 없습니다. 나 자신의 제작자를 만들려고했지만 아직 Java SE의 Weld와 CDI에 익숙하지 않습니다.

내 고장 프로듀서 나는 누군가가 나를 도울 수 그래서 만약 내가 기쁠 것,이 문제에 대한 뭔가를 찾을 수 없습니다

public class InjectionProvider { 

    @Produces 
    public Module getInsrance(Class<?> clazz) throws ReflectiveOperationException { 
     final Constructor<?> constructor = clazz.getDeclaredConstructor(); 
     return (Module) constructor.newInstance(); 
    } 
} 

(나는 그것 totaly 나쁜 생각). Module 클래스에서 일부 속성을 변경해야 할 때마다 코드를 변경하고 싶지 않기 때문에 실제로 클래스를 만드는 방법이 필요합니다.

편집 :

나는 그것이 생산자와 할 수 없습니다. 하지만 해결 방법을 찾았습니다. 나는 그것이 좋은 해결책인지 잘 모르겠지만 지금은 효과가있다.

Weld 컨텍스트를 사용하여 싱글 톤 클래스를 만들었습니다.

public class TheMightyWeld { 

    private static Weld weld; 

    private static WeldContainer weldContainer; 

    public static WeldContainer getThePowerOfCreation() { 
     if (weldContainer == null) { 
      weld = new Weld(); 
      weldContainer = weld.initialize(); 
     } 
     return weldContainer; 
    } 

    public static void shutdown() { 
     if (weld != null) { 
      weld.shutdown(); 
     } 
    } 

} 

그리고 나는

TheMightyWeld.getPowerOfCreation().instance().select(FXApplicationStarter.class).get().startApplication(primaryStage, getParameters()); 

내 응용 프로그램을 초기화 할 수 있습니다 그리고 나중에 코드에서 내가 편집 반사

module = (Module) TheMightyWeld.getPowerOfCreation().instance().select(moduleClass).get(); 

2를 다시 사용할 수 있습니다 : 내가 찾은

더 나은 해결책. 나는

@Inject 
private Instance<Object> creator; 

그때 내가 할 수있는 용접 인스턴스를 삽입 할 수에만이

creator.select(moduleClass).get(); 

나는이 좋은 해결책이라고 생각합니다.

답변

0

편집 된 게시물보기 누군가가 더 나은 해결책을 가지고 있다면 나는 그것을 기쁘게 생각합니다.

0

고객님의 질문을 정확하게 이해할 수 있을지 모르겠는데 특별히 제작자가 사용하는 코드 대 클래스 로딩과 관련된 부분이 있습니다. 인젝션이 Class.forName을 통해 사용자가 직접 인스턴스화 할 것으로 예상되는지 궁금합니다. 프레임 워크를 통해 객체 의 장식이 수정 된 클래스 로더를 사용하고 수정 된 객체 또는 장식 된 객체 인 을 반환하면 접근 방식으로이 장식 (종속성 삽입)을 사용하지 않도록 설정 한 것 같습니다. 리플렉션을 통해 구체화 을 사용하는 대신 새로 추가 호출을 사용하지 않고 을 클래스 로더에 남겨 둡니다.

+0

예. 그게 내가 용접 클래스 로더를 사용하지 않는 문제입니다. 내 제작자는별로 좋지 않습니다. 보지 마세요. 그래서 내 질문은 : 어떻게 용접을 사용하여 내 개체를 이와 비슷한 방식으로 인스턴스화 할 수 있습니다. 왜냐하면 저는 어떤 수업을 실례로 알지 못하기 때문입니다. 나는 그들이 모듈 인터페이스를 구현할 것이라는 것을 알고 있으며 앞으로 많은 객체를 가질 수 있으므로 다른 방법으로 인스턴스화하는 것은 불가능합니다. – enkor

+0

그래,하지만 이것은 역설처럼 보인다. cdi는 선언적이기 때문에 동적 유형의 비트를 사용합니다. 예를 들어 상식 주입은 리플렉션을 통해 도달 할 수없는 지점에서 발생합니다. 귀하의 객체는 그 방법을 인스턴스화된 cdi 제공자를 모릅니다. – Peter

+0

아마 당신은 cdi 클래스 로더를 호출하는 자신의 클래스 로더를 사용할 수 있습니다. 그러나 이것은 보안 문제이므로 귀하의 용접 제공자 (컨테이너)는 그러한 접근법을 허용하지 않을 것입니다. 리플렉션을 사용하면 반사 객체 자체가 실제로 무거운 물건을 프록시 처리한다는 의미가됩니다. – Peter

관련 문제