상황을 고려하자. N 개의 모듈이 있고 모두 동일한 인터페이스 (com.foo.SomeService
)의 서비스를 가지고있다. 모든 모듈의 모든 서비스를 반복하지 않고도이 서비스를 모듈 이름 (my.module
)으로 가져올 수 있습니까?Java 9에서 모듈 이름으로 서비스를받을 수 있습니까?
2
A
답변
3
실제 질문인지 여부는 알 수 없습니다. 서비스 공급자를 선택하는 올바른 방법은 기능을 탐색하는 것입니다. 즉, 소비자가 적절한 구현을 선택할 수 있도록 적절한 서비스 인터페이스를 설계하는 것입니다.
ServiceLoader.load(service).stream()
.filter(p -> "X".equals(p.type().getModule().getName()))
.map(Provider::get)
.findAny();
:
이 질문은 당신이 정말로 필요로하는 경우 모듈 이름을 선택하는 것은 어렵지 않다 다음 특정 서비스 공급자를 사용하도록 뭔가를 구성하는 방법에 대한 경우
3
ModuleDescriptor.Provides
은 모듈에서 제공하는 서비스의 이름을 제공 할 수 있습니다.
Module module; // representation for your 'my.module'
Set<ModuleDescriptor.Provides> provides = module.getDescriptor().provides();
provides.forEach(p -> {
System.out.println("service - " + p.service());
System.out.println("providers - " + p.providers());
});
모듈 선언 인 경우 다음과 같이
AnnotateElemenImpl
클래스
java.lang.reflect
모듈에서 인터페이스의
AnnotatedElement
된 구현을 제공
module my.module {
...
provides java.lang.reflect.AnnotatedElement with AnnotateElemenImpl;
}
. 위의 공유 코드 세그먼트는 다음과 같은 세부 정보를 반환합니다.
service - java.lang.reflect.AnnotatedElement
providers - [com.module.AnnotateElemenImpl]