@Annotation ... como rastrear as anotações ? [RESOLVIDO]

como que eu consigo descobrir o nome de um campo com a anotação @Id ??
e mais, se possivel, como descobrir se há uma outra anotação @Column e caso houver descobrir o valor do parametro name, @Column(name="…")[code] public class Material{
@Id @Column(name=“cod_interno”) private Integer id;
@NotNull private String nome;
//… métodos
}

public class Aluno{
	@Id private Integer matricula;
	@NotNull private String nome;
	//... métodos
}

[/code]
queri algo + ou - assim

public String findIdColumnName(Class clazz) { //... procedimentos para encontrar o nome do id }

ai eu faria algo como

//... resultado do console abaixo ... System.out.println(findIdColumnName(Aluno.class)); //cod_interno System.out.println(findIdColumnName(Matricula.class)); //matricula

segue solução

[code] public static String findIdColumnName(Class<?> clazz) {
Field idField = findIdField(clazz);
return (idField == null) ? null : getColumnName(idField);
}

public static Field findIdField(Class<?> clazz) {
	Field idField = null;
	Field[] fieldList = clazz.getDeclaredFields();
	int cursor = 0;
	boolean needSearch = (fieldList.length > 0);
	while (needSearch) {
		Field field = fieldList[cursor++];
		if (field.isAnnotationPresent(Id.class))
			idField = field;
		needSearch = (idField == null && cursor < fieldList.length);
	}
	return idField;
}

public static String getColumnName(Field field) {
	return field.isAnnotationPresent(Column.class) ?
				field.getAnnotation(Column.class).name() : field.getName();
}[/code]

public String findIdColumnName(Class clazz) {  
			List<String> r = new ArrayList<String>();
			Field[] fileds = clazz.getDeclaredFields();
			for (Field f : fileds) {
				for(Annotation annotation : f.getAnnotations())
					if(annotation.equals(Id.class))
						return f.getName();
			}
			return "";
		}  

vlw cara ^^ teu código funfou, aliais, quase… tive q fazer uma modificação…

na linha

if(annotation.equals(Id.class))  

troquei por

if(annotation.annotationType().equals(Id.class)) 

esse já funfou pra achar o nome… no caso de quando tem Column ainda não … vou ver c dou uma mudada aki

meu código por enquanto ta assim

[code]public class Teste {
public class Material{
@Id @Column(name=“cod_interno”) private Integer id;
@NotNull private String nome;
//… métodos
}

public class Aluno{
	@Id private Integer matricula;
	@NotNull private String nome;
	//... métodos
}
public static void main(String[] args) {
	//... resultado do console abaixo ...  
	System.out.println(findIdColumnName(Aluno.class));  
	//cod_interno  
	System.out.println(findIdColumnName(Material.class));  
	//matricula  
}
public static String findIdColumnName(Class clazz) {    
	String fieldName = null;
    Field[] fileds = clazz.getDeclaredFields();  
    for (Field f : fileds) {  
        for(Annotation annotation : f.getAnnotations())
            if(annotation.annotationType().equals(Id.class)) {
            	fieldName = f.getName();
            	break;
            }
    }  
    return fieldName;  
} 

}[/code]

Assim eu acho que te atende.


public String findIdColumnName(Class clazz) {
		List<String> r = new ArrayList<String>();
		Field[] fileds = clazz.getDeclaredFields();
		for (Field f : fileds) {
				if (f.getAnnotation(Id.class)!=null){
					if(f.getAnnotation(Column.class)!=null))
						return f.getAnnotation(Column.class).name();
						
					return f.getName();
				}
		}
		return "";
	}

é agora funciona… eu fiz um pouco diferente do seu… por conta da norma da sun que fala pra num usar + de 1 return no mesmo método

public static String findIdColumnName(Class clazz) { String fieldName = null; Field[] fileds = clazz.getDeclaredFields(); int cursor = 0; boolean needSearch = (fileds.length > 0); while (needSearch) { Field f = fileds[cursor++]; if (f.isAnnotationPresent(Id.class)) if (f.isAnnotationPresent(Column.class)) fieldName = f.getAnnotation(Column.class).name(); else fieldName = f.getName(); needSearch = (fieldName == null && cursor < fileds.length); } return fieldName; }

[quote=“prbpedro”]for(Annotation annotation : f.getAnnotations())
if(annotation.equals(Id.class))
return f.getName();[/quote]

No lugar desse for, o código abaixo não funciona?

if(f.isAnnotationPresent(Id.class)){