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();
나는이 좋은 해결책이라고 생각합니다.
예. 그게 내가 용접 클래스 로더를 사용하지 않는 문제입니다. 내 제작자는별로 좋지 않습니다. 보지 마세요. 그래서 내 질문은 : 어떻게 용접을 사용하여 내 개체를 이와 비슷한 방식으로 인스턴스화 할 수 있습니다. 왜냐하면 저는 어떤 수업을 실례로 알지 못하기 때문입니다. 나는 그들이 모듈 인터페이스를 구현할 것이라는 것을 알고 있으며 앞으로 많은 객체를 가질 수 있으므로 다른 방법으로 인스턴스화하는 것은 불가능합니다. – enkor
그래,하지만 이것은 역설처럼 보인다. cdi는 선언적이기 때문에 동적 유형의 비트를 사용합니다. 예를 들어 상식 주입은 리플렉션을 통해 도달 할 수없는 지점에서 발생합니다. 귀하의 객체는 그 방법을 인스턴스화된 cdi 제공자를 모릅니다. – Peter
아마 당신은 cdi 클래스 로더를 호출하는 자신의 클래스 로더를 사용할 수 있습니다. 그러나 이것은 보안 문제이므로 귀하의 용접 제공자 (컨테이너)는 그러한 접근법을 허용하지 않을 것입니다. 리플렉션을 사용하면 반사 객체 자체가 실제로 무거운 물건을 프록시 처리한다는 의미가됩니다. – Peter