[RESOLVIDO]Pegar value (valor) de classe anotada com anotação própria

Bom dia pessoas,

Estou tentando retornar o valor de uma classe anotada com uma anotação própria minha. Segue a interface da anotação:

[code]package interfaces;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Models {

String value();

}
[/code]

Ai anoto um JFrame assim:

[code]@Models(value=“models.Cliente”)
public class NovoCliente extends javax.swing.JFrame {

//blablabla

}[/code]

Após isso carrego a classe, e tento receber o valor de “value”:

[code]Class classe = Class.forName(nomeDaClasse);

System.out.println("ANNOTATION: " + classe.getAnnotation(Models.class).toString());
[/code]

O que me retorna a seguinte String no console: “@interfaces.Models(value=models.Cliente)”

Ai está o problema, pois eu queria retornar apenas “models.Cliente”, e em um método ou campo de uma classe eu usaria:

classe.getAnnotation(Models.class).value()

Mas como se trata de uma classe, o value não fica disponível diretamente - o que me retornaria a String no console “models.Cliente”, apenas.

Eu até consigo pegar o valor certinho usando replace da String, mas é muita gambi, e queria saber fazer corretamente com uma classe. Se alguem puder dar uma luz, pois estou tentando isso há 3 dias sem sucesso.

Muito obrigado desde já, abraços!

Não entendi nada!!

O código

classe.getAnnotation(Models.class).value()

já te retorna a string armazenada no atributo “value” da sua anotação. O que você queria que retornasse?

Boa tarde Ataxexe!

Muito obrigado por estar ajudando!

Então, o ponto é que

classe.getAnnotation(Models.class).value()

não existe!

Para atributos e métodos, eu consigo acessar o value, mas como anotei uma classe, o value() fica inacessível.
Eu consigo pegar apenas por

classe.getAnnotation(Models.class).toString()

mas que me retorna “@interfaces.Models(value=models.Cliente)”

Revirei a net e vi outras pessoas com a mesma dificuldade, mas nenhuma aparente solução.

Método utilitário para isso:

public <T> T getAnnotation(Class<T> annotation) {
		return this.getAnnotation(annotation);
}

para usá-lo:

String valor = getAnnotation(Models.class).value();

kleberdamasco,

Não entendi onde usar os métodos.

[quote=$ERVER]Boa tarde Ataxexe!

Muito obrigado por estar ajudando!

Então, o ponto é que

classe.getAnnotation(Models.class).value()

não existe!

Para atributos e métodos, eu consigo acessar o value, mas como anotei uma classe, o value() fica inacessível.
Eu consigo pegar apenas por

classe.getAnnotation(Models.class).toString()

mas que me retorna “@interfaces.Models(value=models.Cliente)”

Revirei a net e vi outras pessoas com a mesma dificuldade, mas nenhuma aparente solução.
[/quote]

Estranho…eu faço isso aqui direto e não tem problema…Se está tão complicado assim faça um cast ou use o depurador pra ver o que está retornando porque o método getAnnotation vai retornar a própria anotação com todos os atributos.

Ataxexe,

Você deve fazer com atributos e métodos, mas com classes pelo que andei lendo não tem como pegar o value de classe anotada não - ao menos que eu sabia.

Quando digo classe anotada, quero dizer o seguinte:

[code]@Anotacao(value=“algum valor”)
public class Teste {

}[/code]

Quando faço a anotação em um atributo de uma classe, funciona:

[code]public class Teste {

@Anotacao(value=“algum valor”)
private String atributo;

}
[/code]

Talvez estejamos confundindo isso: quando digo “classe anotada”, me refiro a primeiro código acima, e não ao segundo.

Tem como vc me postar algum exemplo seu que dê certo ai, pq fiquei curioso.

Vlw por tudo até agora, abraços!

kleberdamasco,

Eu não entendi como usar seu exemplo, se puder dar umas dicas, por favor.

Abraços!

1º Passo
coloque essa função dentro da classe que você deseja buscar a anotação:

public <T> T pegaAnotacao(Class classeComAnotacao, Class<T> anotacaoNecessaria) {  
        return (T) classeComAnotacao.getAnnotation(anotacaoNecessaria);  
	} 

2º Passo

faça isso:

Class clazz = Class.forName("br.com.Cliente");
Models anotacao = pegaAnotacao(clazz, Models.class);
System.out.println(anotacao.value());
                

Desta forma você verá que vai imprimir o valor no console.

[code]Class classe = Class.forName(“Teste”);

        Annotation[] annotations = classe.getAnnotations();

        for (Annotation annotation : annotations) {
            if (annotation instanceof Binding) {
                Binding anotacao = (Binding) annotation;
                System.out.println("classes: " + anotacao.classes());
                System.out.println("domainAttr: " + anotacao.domainAttr());
            }
        }[/code]

[quote=$ERVER]Ataxexe,

Você deve fazer com atributos e métodos, mas com classes pelo que andei lendo não tem como pegar o value de classe anotada não - ao menos que eu sabia.

Quando digo classe anotada, quero dizer o seguinte:

[code]@Anotacao(value=“algum valor”)
public class Teste {

}[/code]

Quando faço a anotação em um atributo de uma classe, funciona:

[code]public class Teste {

@Anotacao(value=“algum valor”)
private String atributo;

}
[/code]

Talvez estejamos confundindo isso: quando digo “classe anotada”, me refiro a primeiro código acima, e não ao segundo.

Tem como vc me postar algum exemplo seu que dê certo ai, pq fiquei curioso.

Vlw por tudo até agora, abraços![/quote]

De forma alguma. Isso sempre funcionou pra classes, dê uma olhada:

[code]import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class TesteAnotacao {

@Retention(RetentionPolicy.RUNTIME)
public static @interface MinhaAnotacao {

String value();

}

@MinhaAnotacao(“valor”)
public static class MinhaClasse {

}

public static void main(String[] args) {
MinhaAnotacao anotacao = MinhaClasse.class.getAnnotation(MinhaAnotacao.class);

System.out.println(anotacao.value());

}

}[/code]

Ataxexe:

No caso dele, como ele não parametrizou para buscar a classe por nome vem como genérica e desta forma
não sabe que tem a anotação presente.
Se fizer assim

Class<Seila> teste = (Seila)Class.ForName('br.com.Seila');

vai estar parametrizada e logo vai conseguir pegar a anotação sem aquele método que passei.

Entendeu?

[quote=kleberdamasco]Ataxexe:

No caso dele, como ele não parametrizou para buscar a classe por nome vem como genérica e desta forma
não sabe que tem a anotação presente.
Se fizer assim

Class<Seila> teste = (Seila)Class.ForName('br.com.Seila');

vai estar parametrizada e logo vai conseguir pegar a anotação sem aquele método que passei.

Entendeu?[/quote]

Sim, por isso eu disse pra ele fazer um cast algumas mensagens acima.

Isso aqui também funciona e é aplicável ao problema dele:

[code]import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class TesteAnotacao {

@Retention(RetentionPolicy.RUNTIME)
public static @interface MinhaAnotacao {

String value();

}

@MinhaAnotacao(“valor”)
public static class MinhaClasse {

}

public static void main(String[] args) {
Class<?> classe = MinhaClasse.class;
MinhaAnotacao anotacao = classe.getAnnotation(MinhaAnotacao.class);

System.out.println(anotacao.value());

}

}[/code]

O problema é que ele está afirmando que valores de anotações de classe não podem ser pegos e eu estou mostrando que podem.

Entendeu?

Ataxexe,

Realmente, fiz o cast e funcionou!

Muito obrigado pela ajuda, à ambos!

Abraços!