Annotation não aparece no getAnnotations()

7 respostas
MasterDevil

Galera boa tarde, to com um probleminha aqui, criei um annotation, da seguinte maneira :

@Target (ElementType.METHOD)
@Retention(value=RetentionPolicy.RUNTIME)
public @interface Logged {

}

Em uma classe minha anotei da seguinte forma meu metodo :

@Logged
public String getDescricao() {
	return descricao;
}

Quando instancio um objeto dessa classe que possui o metodo acima anotado com meu annotation "Logged" e tento ultilizar um isAnnotationPresent(Logged.class), ele me retorna false, alguma ideia falera doque pode ser ?

Desde já agradeço !
=)

Abraços ! :P

7 Respostas

MasterDevil

Alguem ai ? =|

T

Você precisa perguntar se o método tem uma determinada anotação, não se a classe tem a tal anotação.

Então você não pode usar Class.isAnnotationPresent, mas sim listar os métodos dessa classe a que pertence esse objeto com Class.getMethods, e então testar cada objeto Method com Method.getAnnotation

MasterDevil

Thiago ! Bom dia é isso que estou fazendo, da seguinte maneira :

for (Method method : dominio.getClass().getDeclaredMethods()) { System.out.println("Entrei no looooopppp !!"); if (method.isAnnotationPresent(Logged.class)) { System.out.println("Econtrei uma anotation logged !"); } }

mais mesmo ela estando lá, ele naum a encontra :frowning:

estranho neh?

abraços amigo !

T

Hum… levando em conta que meu nome não é Thiago, James ou qualquer pai do Harry Potter, você não poderia pelo menos imprimir que métodos você está mostrando? “Entrei no looop” não é muito informativo (só para a gente saber que você entrou numa fria), mas

for (Method method : dominio.getClass().getDeclaredMethods()) {
			System.out.println("method " + method.toString());

já lhe ajuda bem mais.
Talvez em vez de “getDeclaredMethods” você precise usar alguma outra coisa.

MasterDevil

Mil desculpas por te chamar de Thiago, acreditava eu ter lido thiago ao invés de thingol, me desculpe !

Printei o nome dos metodos que o declaredMethods esta me retornando


14:02:57,243 INFO [STDOUT] metodo getId
14:02:57,243 INFO [STDOUT] metodo setId
14:02:57,243 INFO [STDOUT] metodo getDescricao[color=red] [/color]
14:02:57,244 INFO [STDOUT] metodo setDescricao
14:02:57,244 INFO [STDOUT] metodo setDataAtualizacao
14:02:57,244 INFO [STDOUT] metodo getDataAtualizacao
14:02:57,244 INFO [STDOUT] metodo getRegional
14:02:57,245 INFO [STDOUT] metodo setRegional

O metodo que esta anotado com a minha anotação, passa pela verificação do isAnnotationPresent, e mesmo assim retorna false.

Muito estranho isso, pelo que li ta tudo certo…

Alguma ideia ?
Muito obrigado, e desculpe novamente !

T

Agora vou ser um pouquinho mais chato. Pode imprimir, para cada método, que anotações ele tem? (em vez de usar “isAnnotationPresent”, usar “getAnnotations” e ir imprimindo o que você achar para cada método?

MasterDevil

Opaaa amigo segue abaixo o codigo que fiz :
Ele não imprime nada, pois o unico metodo que possui anotacao e o que tem a anotação que eu criei, que por sinal não retorna, POREM … efetuei o teste de colocar um @Id do persistence … em um metodo apenas pra saber se ele retornaria, e SIM … ele retornou …
O unico que não retorna e o meu annotation :frowning:

Abaixo o codigo para detectar :

for (Method method : dominio.getClass().getDeclaredMethods()) { for (Annotation annotation : method.getAnnotations()) { System.out.println(">>>> Anotacao detectada : " +annotation.getClass().getName()); if (annotation instanceof Id) { idName = method.getName().replace("set", "").replace("get", ""); } if (annotation instanceof Logged) { System.out.println("Campo Logado detectado === " + method.getName()); loggedFields.add(method.getName()); } } }

E abaixo o da classe que eu varro :

@Entity

@Table(name="ADC_SUCURSAIS", schema=WebAdcConstants.DATABASE_SCHEMA)

@SequenceGenerator(sequenceName="SEQ_ADC_SUCURSAIS", name="SEQ")

public class Sucursal implements Serializable {

	private static final long serialVersionUID = 1L;



	@Id

	@GeneratedValue(generator="SEQ", strategy=GenerationType.SEQUENCE)

	@Column(name="ID")

	private Long id;

	

	@Column(name="DESCRICAO")

	public String descricao;

	

	@ManyToOne(fetch=FetchType.EAGER)

	@JoinColumn(name="REGIONAL_ID", referencedColumnName="ID")

	private Regional regional;

	

	@Temporal(value=TemporalType.DATE)

	@Column(name="DATA_ATUALIZACAO")

	private Date dataAtualizacao;



	public Long getId() {

		return id;

	}

	

	public void setId(Long id) {

		this.id = id;

	}

	

[color=red][b]	@Logged

	public String getDescricao() {

		return descricao;

	}

[/b]	[/color]

	public void setDescricao(String descricao) {

		this.descricao = descricao;

	}

	

	public Regional getRegional() {

		return regional;

	}

	

	public void setRegional(Regional regional) {

		this.regional = regional;

	}

	

	public Date getDataAtualizacao() {

		return dataAtualizacao;

	}



	public void setDataAtualizacao(Date dataAtualizacao) {

		this.dataAtualizacao = dataAtualizacao;

	}


}

Abraços !

Criado 10 de março de 2009
Ultima resposta 11 de mar. de 2009
Respostas 7
Participantes 2