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

5 respostas
Lavieri
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="...")
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
	}
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
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();
	}

5 Respostas

P
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 "";
		}
Lavieri

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

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;  
    } 
}
P

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 "";
	}
Lavieri

é 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; }

J
<blockquote><div class="quote-author">“prbpedro”:</div>for(Annotation annotation : f.getAnnotations())

if(annotation.equals(Id.class))

return f.getName();</blockquote>

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

if(f.isAnnotationPresent(Id.class)){
Criado 6 de janeiro de 2009
Ultima resposta 6 de jan. de 2009
Respostas 5
Participantes 3