Pergunta

Eu sou um pouco novo no Java, então talvez eu entenda mal os casos de uso para anotações em Java. Meu problema é o seguinte:

Após anotar um método, recebo nomes de classe como $ proxy31 ao inspecionar as anotações no método. Estou curioso para saber por que estou recebendo nomes de classe para minhas anotações semelhantes a isso e o que posso fazer para corrigir esse problema.

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

Isso retorna uma anotação nula, apesar de eu saber que o método que está procurando tem a anotação necessária de permanência implementada.

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

Isso imprime os nomes de classe $ proxy31.

Foi útil?

Solução

Dada a anotação A, você precisa ligar para o ANNOTATIONTYPE (), não getClass () para determinar o tipo de anotação. Um objeto de anotação é apenas um proxy que representa essa instância da anotação nessa classe.

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

Outras dicas

Quando você adiciona anotações no código -fonte, o Java realmente cria um monte de interfaces e classes "sob o capô" para permitir que você (ou suas ferramentas) pergunte ao programa coisas sobre as anotações usando restrições. As anotações do método criam "proxies dyanmicos" e, portanto, Java cria classes para você, provavelmente com o proxy do nome.

Se você estiver interessado nisso, leia em java.lang.reflect.invocationhandler e seu subtipo, anotaçãoinvocationhandler

Dito isto, você não deve se preocupar com o que Java realmente gera. Suspeito que você não esteja usando a reflexão corretamente para inspecionar suas anotações de um programa Java.

Além disso .. lembre -se de definir isso:

@Retention(RetentionPolicy.RUNTIME)

em sua anotação, para que viva além da compilação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top