2016-08-14 39 views
0

例子我想說明適用於:如何傳遞/訪問註釋信息?我目前的圖書類的

@DatabaseTable(tableName = "books") 
public class Book { 

    @DatabaseField(generatedId = true) 
    private int mId; 

    @DatabaseField(columnName = "book_name", canBeNull = false) 
    private String mBookName; 

    @DatabaseField(canBeNull = false) 
    private String mAuthorName; 

.... 

我的註釋接口:

PU

blic @interface DatabaseTable { 
    String tableName() default ""; 
} 

public @interface DatabaseField { 
    String columnName() default ""; 
    boolean generatedId() default false; 
    boolean canBeNull() default true; 
} 

然後在我的MainActivity中我嘗試過:

public class MainActivity extends AppCompatActivity { 
    private final String LOG_TAG = getClass().getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Book book = new Book("The Book of Kittens", "Mr. Smith"); 

     outputInfoAboutClass((Class<? extends DatabaseTable>) book.getClass()); 
    } 

    private void outputInfoAboutClass(Class<? extends DatabaseTable> aClass) { 
     Log.i(LOG_TAG, "Class simple name: " + aClass.getSimpleName()); 

     for (Field field : aClass.getFields()) { 
      Log.i(LOG_TAG, "Field name: " + field.getName()); 
     } 

     for (Annotation annotation : aClass.getAnnotations()) { 
      Log.i(LOG_TAG, "Annotation name: " + annotation.toString()); 
     } 

     Log.i(LOG_TAG, "End of logging!"); 
    } 
} 

我想要做的是制定一個通用的方法,它接受一個類,並能夠揭示底層註釋和它們的值/屬性,但我認爲我會做的全部錯誤。例如,我將如何參與這個類(可能是一本書,可能是其他內容),並能夠確定「這是tableName,這些是我們定義爲DatabaseFields的成員變量,這些是我們設置的設置對於這些領域,」等

+0

附註:[Martin Fowler關於ORM討厭的文章](http://martinfowler.com/bliki/OrmHate.html)對於任何考慮「滾動自己的」ORM的人來說都是一個很好的解讀。 –

+0

在我點擊那個鏈接之前,是否會提供可預測的建議:「基本上不這樣做,只是使用一個已有的」? –

+1

實際上並不是。它總是「依賴」。但是編寫一個簡單的ORM是相當多的工作。 –

回答

0

Oracle有這方面的一些好的文檔: https://docs.oracle.com/javase/tutorial/java/annotations/ http://www.oracle.com/technetwork/articles/hunter-meta-2-098036.html

的主題是複雜的,有很多的步驟,因此它不適合快速摘要這裏。您使用@interface TypeName聲明瞭一種特殊類型的接口,並填寫一些邏輯,通常使用反射。

在向客戶發佈代碼之前,您應該仔細研究和實踐。

+0

我編輯了我的OP。思考? –