J'ai créé simple annotation en Javaannotations Java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
String columnName();
}
et classe
public class Table {
@Column(columnName = "id")
private int colId;
@Column(columnName = "name")
private String colName;
private int noAnnotationHere;
public Table(int colId, String colName, int noAnnotationHere) {
this.colId = colId;
this.colName = colName;
this.noAnnotationHere = noAnnotationHere;
}
}
je dois itérer sur tous les domaines, qui sont annotés avec Column
et obtenir nom et valeur de champ et d'annotation. Mais j'ai un problème avec obtenir valeur de chaque champ, car ils sont tous de de type de données différent.
Y a-t-il quelque chose qui retournerait la collection de champs qui ont une certaine annotation? J'ai réussi à le faire avec ce code, mais je ne pense pas que la réflexion soit un bon moyen de le résoudre.
Table table = new Table(1, "test", 2);
for (Field field : table.getClass().getDeclaredFields()) {
Column col;
// check if field has annotation
if ((col = field.getAnnotation(Column.class)) != null) {
String log = "colname: " + col.columnName() + "\n";
log += "field name: " + field.getName() + "\n\n";
// here i don't know how to get value of field, since all get methods
// are type specific
System.out.println(log);
}
}
Dois-je envelopper tous les champs objet, ce qui mettrait en œuvre la méthode comme getValue()
, ou est-il une meilleure façon de contourner cela? Fondamentalement, tout ce dont j'ai besoin est une représentation sous forme de chaîne de chaque champ qui est annoté.
modifier: yep field.get(table)
fonctionne, mais seulement pour les champs public
, y a-t-il un moyen de le faire même pour les champs private
? Ou dois-je faire getter et en quelque sorte l'invoquer?
setAccessible. La version de tableau sera plus rapide si vous avez un gestionnaire de sécurité présent. setAccessible est, bien sûr, très dangereux dans les situations où vous avez un responsable de la sécurité. –
effrayant ...On dirait que vous implémentez votre propre version de JPA – basszero
@basszero: Oui, vous avez raison, je dois le faire pour mon projet de collège à cause de mon stupide prof qui vit dans une grotte et ne permet pas d'utiliser des bibliothèques telles que Toplink etc ... –