2010-04-08 2 views
0

여러 페이지를 쓰지 않고 이것을 설명하는 방법을 모르겠으므로 실제 코드가 더 표현력이 있기를 바랍니다.자바 주석 - 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)"이 있습니까?

희망은 분명히 ... 희망은 누군가 나를위한 해결책을 가지고 ... 당신은 더 많은 정보가 필요하면 - 알려주세요.

감사합니다.

+0

올바른 패키지 정보 클래스가로드되고 있습니까? –

답변

0

예,

하나의 패키지에 하나의 패키지 정보 클래스가 있기 때문에.

관련 문제