문제

나는 Java에 다소 새로운 것이므로 아마도 Java의 주석 사용 사례를 오해 할 것입니다. 내 문제는 다음과 같습니다.

메소드에 주석을 달면 메소드에서 주석을 검사 할 때 $ proxy31과 같은 클래스 이름을받습니다. 왜 이와 비슷한 주석에 대한 수업 이름을 받고 있는지, 그리고이 문제를 해결하기 위해 무엇을 할 수 있는지 궁금합니다.

Method m = this.remoteServiceClass.getMethod(rpcRequest.getMethod().getName());
RequiredPermission a = m.getAnnotation(RequiredPermission.class);

이는 찾고있는 메소드가 요구하는 경우에 필요한 주석이 구현된다는 것을 알고 있지만 널 주석을 반환합니다.

for(Annotation a : m.getAnnotations())
{
    System.out.println(a.getClass().getName());
}

이것은 $ proxy31 클래스 이름을 인쇄합니다.

도움이 되었습니까?

해결책

주석 A가 주어지면 주석의 유형을 결정하려면 getClass ()가 아닌 AnnotationType ()를 호출해야합니다. 주석 객체는 해당 클래스의 주석 인스턴스를 나타내는 프록시입니다.

Object o = ...;
Class c = o.getClass();
Annotation[] as = c.getAnnotations();
for (Annotation a : as) {
   // prints out the proxy class name
   System.out.println(a.getClass().getName());
   // prints out the name of the actual annotation
   System.out.println(a.annotationType().getName());
}

다른 팁

소스 코드에 주석을 추가 할 때 Java는 실제로 "Hood hood"에 "hood hood"에 대한 다양한 인터페이스와 클래스를 생성하여 제한을 사용하여 주석에 대한 프로그램을 요청할 수 있도록합니다. 메소드 주석은 "dyanmic proxies"를 생성하므로 Java는 아마도 이름 프록시로 클래스를 만듭니다.

관심이 있으시면 java.lang.reflect.invocationHandler 및 하위 유형을 읽으십시오.

즉, Java가 실제로 생성하는 것에 대해 걱정할 필요는 없습니다. Java 프로그램 내에서 주석을 검사하기 위해 반사를 올바르게 사용하지 않는다고 생각합니다.

또한 .. 이것을 설정해야합니다.

@Retention(RetentionPolicy.RUNTIME)

주석에 컴파일 너머로 살도록하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top