2009-04-10 51 views
15

我創建了簡單的註解在Java中Java註解

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface Column { 
    String columnName(); 
} 

和類

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

我需要遍歷所有領域,被標註有Column並得到的字段和註釋。但我得到每個領域的問題,因爲他們都是不同的數據類型

有沒有什麼會返回具有某些註釋的字段的集合? 我設法用這段代碼來做,但我不認爲這種反射是解決它的好方法。

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

我一定要在包裝物各個領域,這將實現像getValue()方法,還是有一些解決這個更好的辦法?基本上我需要的是每個被註釋的字段的字符串表示。

編輯:yep field.get(table)作品,但只有public領域,有沒有什麼辦法如何做到這一點,即使是private領域?或者我必須讓getter和以某種方式援引它?

+0

setAccessible。如果您有安全管理器,陣列版本會更快。當你擁有安全管理員的情況下,setAccessible當然是非常危險的。 – 2009-04-10 16:22:53

+0

可怕...看起來你正在實施你自己的版本JPA – basszero 2009-04-10 16:29:48

+0

@basszero:是的你是對的,我必須爲我的大學項目做這個,因爲我的愚蠢的老師住在山洞裏,不允許使用任何圖書館,如Toplink等... – 2009-04-10 17:24:19

回答

11

每個對象都應該有toString()定義。 (你可以覆蓋這個每個類來獲得更有意義的表示)。

那麼,你的「//這裏我不知道」的評論是,你可以有:

Object value = field.get(table); 
// gets the value of this field for the instance 'table' 

log += "value: " + value + "\n"; 
// implicitly uses toString for you 
// or will put 'null' if the object is null 
9

反思是正是的方式來解決它。在執行時發現關於類型及其成員的事情幾乎是反射的定義!你做的這種方式對我來說看起來很好。

要查找字段的值,使用field.get(table)

4

反思是正好看註解的方式。它們是附加到類或方法的「元數據」的一種形式,並且Java註釋被設計爲以這種方式進行檢查。

2

反射是處理對象的一種方法(可能是唯一的方法,如果字段是私人的,沒有任何一種存取方法)。你需要看看Field.setAccessible或者Field.getType

另一種方法是使用compile-time annotation processor來生成另一個用於枚舉帶註釋的字段的類。這需要Java 5中的一個com.sun API,但在Java 6 JDK中(IDE等IDE可能需要特殊的項目配置)支持更好。