여러 페이지를 쓰지 않고 이것을 설명하는 방법을 모르겠으므로 실제 코드가 더 표현력이 있기를 바랍니다.자바 주석 - Vaadin 프로젝트에서 로케이터 클래스를 호출 할 때의 문제
나는 다음과 같은 여러 주석 선언이 들어있는 항아리했습니다 : 다음
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MarkedPackage {
}
내가 여러 패키지에 여러 클래스를 포함하는 테스트 항아리를 만들어 (와 위의 주석과 함께 하나 개의 패키지를 표시 한을 package-info.java) :
@myPackage.MarkedPackage
package package.test.jar;
이 jar는 주석을 포함하는 jar를 빌드 경로에 포함하고 있습니다.
그런 다음 디렉토리의 모든 항아리가있는 목록을 검색하는 메소드 (LoadPlugins)가있는 정적 클래스를 만들었습니다. 그런 다음 항아리를 통해 'package-info'클래스를 검색하고 클래스 패키지에 MarkedPackage 주석이 있는지 확인합니다.
if (checkPackageAnnotation(thisClass.getPackage()))
여기서 thisClass는 클래스 로더를 통해 검색된 패키지 정보 클래스입니다. 및 :
public static boolean checkPackageAnnotation(AnnotatedElement elem) {
System.out.println(elem.getAnnotations().length);
if (elem == null || !elem.isAnnotationPresent(MarkedPackage.class))
return false;
return true;
}
elem.getAnnotatios(). 길이는 디버그 목적을위한 것입니다.
내가 정적 클래스에서 메서드를 호출 할 때 문제가 나타납니다
내가 메인 함수에서 호출하는 경우 :
public class MyMain {
public static void main(String[] args){
PluginUtils.LoadPlugins();
}
}
모든 것이 표시 '1'이 시스템에서 완벽하게 작동합니다. out.println (elem.getAnnotations(). length);
하지만 내 angel이라는 프로젝트에서 버튼에서 호출 할 경우 : (.) (elem.getAnnotations 길이) 그에서 System.out.println에서
header.addComponent(new Button("CallThat",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
PluginUtils.LoadPlugins();
}
}));
그것은 표시 '0';
또한 내 Vaadin 프로젝트 내부에 메인을 생성 했으므로 빌드 경로와 리소스가 동일해야합니다.
웹 응용 프로그램에 문제가 있으며 "@Retention (RetentionPolicy.RUNTIME)"이 있습니까?
희망은 분명히 ... 희망은 누군가 나를위한 해결책을 가지고 ... 당신은 더 많은 정보가 필요하면 - 알려주세요.
감사합니다.
올바른 패키지 정보 클래스가로드되고 있습니까? –