Uso de Reflaction + Annotation [ Resolvido ]

8 respostas
ccefetpb

Bom dia estou trabalhando com reflaction e annottation pela primeira vez e esbarrei com um problema que não entendi .
Preciso descobrir qual atributo foi marcado com a annotatação @HideAttribute mas meu metodo não esta funcionando :

//minha annotation
public @interface HideAttribute {

}

//minha classe
public class User {
	@HideAttribute
	private String login;
	private String senha;
	private Integer idade;
	
	
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public Integer getIdade() {
		return idade;
	}
	public void setIdade(Integer idade) {
		this.idade = idade;
	}
	
	
}

//meu metodo
	public boolean isHideAttribute(String atribute) {
		boolean result = false;
		try {  
			Class cls = Class.forName(User.class);
			
			Field field = cls.getDeclaredField(atribute);  

                        
			//aqui eu inseri um teste verificando se uma das annotações
                        //da classe user é a @HideAttribute mas as anotaçãoes desse attributo vêm null no debug
			//que codigo vai aqui ?

		}  
		catch (Throwable e) {  
			  
		}  
		
		return result;
	}

//meu main
public static void main(String[] args) {
		ReflactionUtil<User> r = new ReflactionUtil<User>(User.class);
		System.out.println(r.isHideAttribute("login"));
	}

Desde já grato pela ajuda …

8 Respostas

Marky.Vasconcelos

Essa marcação é sua não é?

Como voce fez ela? Talvez falte

@Retention(RetentionPolicy.RUNTIME)

PS: É Reflection e não reflaction como voce escreveu tantas vezes.

ccefetpb

Desculpe =P , como eu disse 1ª vez mechendo com REFLECTION .
Bem usando o eclipse eu cliquei no projeto > new Annotation pus o nome e pronto !
Acredito que o erro seja na logica que tentei usar , pq ao usar anotações nativas do java como @Target eu rodei e ainda assim não funcionou !

Se não deixei claro o que preciso é descobrrir se o atributo foi marcado x foi marcado com a anotação y.

Sei que talvez seja pedir muito , mas se alguem pudesse colar o codigo que vai ali ( abaixo dos comentario ) eu resolveria meu problema =.=.

Novamente desculpas =P e obg pela ajuda =D.

Marky.Vasconcelos

Posta sua anotação ai.

Voce tem que colocar aa notação que passei nela.

Tipo:

@Retention(RetentionPolicy.RUNTIME)
public @interface HideAttribute {
//sua annotation
}

Só assim voce consegue procurar via Reflection essas anotações. Se não as anotações são perdidas depois de compilado.

Aproveitando queria fazer uma pergunta.
Qual utilidade das anotações se não em Runtime?
(Desconsiderando as da compilação como o @SupressWarnings)
Não entendo outra maneira de procura-las antes disso.

ccefetpb

Funcionou …
Muito grato …
bem o metodo ficou assim :

public boolean isHideAttribute(String atribute) {
		boolean result = false;
		try {  
			Class cls = Class.forName(User.class);
			
			Field field = cls.getDeclaredField(atribute);  

			Annotation[] anots = field.getAnnotations();
			
			for ( Annotation a : anots ) {
				if ( a.annotationType().equals(HideAttribute.class) )
					return true;
			}
			
			
		}  
		catch (Throwable e) {  
			  
		}  
		
		return result;
	}

A anotação ficou :

@Retention(value = RetentionPolicy.RUNTIME)
public @interface HideAttribute {

}

Bem existe solução melhor ?

Outra duvida :

Como marco a forum como resolvido ? = P

Obg.

Marky.Vasconcelos
Field field = cls.getDeclaredField(atribute);  
HideAttribute att = field.getAnnotation(HideAttribute.class);//Null se nao existe

Para marcar resolvido edita o primeiro post e muda o titulo com [resolvido]

Marky.Vasconcelos

E anotações não servem apenas para verem se estão presentes.

Voce pode ter valores também.

ccefetpb

grato …
Isso eu sabia , na verdade pra o que estou fazendo preciso apenas saber sobre a marcação ou não .
Ainda tenho muitas duvidas quanto a como criar um objeto , setar os atributos .
Principalmente pq estou tentando misturar reflection , generics , annotations e swing … E não sou especialista em nehuma dessas tecnologias ( nem tenho experiencia ).
Li o tutorial do GUJ e esta me ajudando o problema mesmo e a falta de experiencia e pressa que tenho …
Bem novamente grato pela ajuda .
Espero contar com vc nos proximos foruns … pq acredite duvida e o que nao falta!
Tentarei colocar o nome correto na proxima.

M

Mark_Ameba:
Aproveitando queria fazer uma pergunta.
Qual utilidade das anotações se não em Runtime?
(Desconsiderando as da compilação como o @SupressWarnings)
Não entendo outra maneira de procura-las antes disso.

Pois é…
Segundo o tutorial:

O primeiro caso seria o @SupressWarnings ou @Override (que se usado erroneamente impede a compilação).
O último é o mais comum. Agora, será que alguém teria um exemplo de aplicação prática do segundo caso? (as anotações anotadas com @Documented seriam um exemplo?)

Criado 12 de fevereiro de 2010
Ultima resposta 12 de fev. de 2010
Respostas 8
Participantes 3