2009-09-01 6 views
15

Jestem trochę nowa w Javie, więc być może źle rozumiem przypadki użycia adnotacji w Javie. Mój problem jest następujący:Adnotacja Java zwraca tajemnicze nazwy klas

Po dodaniu adnotacji do metody otrzymuję nazwy klas, takie jak $ Proxy31 podczas sprawdzania adnotacji w metodzie. Ciekawe, dlaczego otrzymuję nazwy klas dla moich adnotacji, które są podobne do tego i co mogę zrobić, aby rozwiązać ten problem.

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

ta zwraca null adnotacji choć wiem, że metoda jest ona patrzy w górę ma adnotacji RequiredPermission realizowane.

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

Spowoduje to wydrukowanie nazw klas $ Proxy31.

+0

Proszę podać krótki, ale kompletny program, aby zademonstrować problem. Bez kodu trudno jest/nie wiadomo, co się dzieje. –

+0

Klasa zdalnego ma metodę lub klasa rpcRequest ma zaimplementowaną adnotację? Czy adnotacja ma zachowywanie w czasie wykonywania i ma zastosowanie do typu metody? (Nie dostaniesz błędów, jeśli adnotacja sama w sobie nie zostanie adnotowana poprawnie, adnotacja zniknie). – Yishai

+0

Metoda remoteServiceClass ma zastosowanie, adnotacja ma zachowywanie w czasie wykonywania i typ elementu docelowego. Używam nazwy z polecenia rpcRequest, aby pobrać aktualną metodę z klasy. – bdorry

Odpowiedz

21

Adnotacja a, należy wywołać metodę adnotationType(), a nie getClass(), aby określić typ adnotacji. Obiekt adnotacji jest po prostu proxy reprezentującym to wystąpienie adnotacji na tej klasie.

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()); 
} 
+1

(Ponieważ adnotacja jest interfejsem i dlatego instancja nie może być konkretną klasą środowiska wykonawczego.) –

+0

To niepoprawne. Interfejs nadal ma powiązany obiekt klasy. – Jherico

+1

@Jherico, to prawda, ale faktyczna instancja środowiska wykonawczego nie będzie miała interfejsu w wyniku jego metody getClass(). – Yishai

1

Po dodaniu adnotacji w kodzie źródłowym, Java faktycznie tworzy kilka interfejsów i klas „pod maską”, co pozwala (lub twoi Narzędzia), aby zapytać, co program o adnotacji wykorzystaniem ograniczeń. Adnotacje metod tworzą "proxy dyanmiczne" i odpowiednio Java tworzy klasy dla ciebie, prawdopodobnie z nazwą Proxy.

Jeśli jesteś zainteresowany tym, czytaj dalej java.lang.reflect.InvocationHandler i jej podtyp, AnnotationInvocationHandler

Mając na uwadze powyższe, nie powinno się martwić o to, co faktycznie generuje Java. Podejrzewam, że nie używasz poprawnie odbicia do sprawdzania adnotacji z poziomu programu Java.

1

.. również pamiętać, aby ustawić to:

@Retention(RetentionPolicy.RUNTIME) 

na swojej adnotacji tak, że mieszka poza kompilacji.