2016-08-14 5 views
0

私は注釈を適用しようとしています私の現在のBookクラスの例:その後、注釈情報を渡したりアクセスしたりする方法は?

PU

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

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

そして:

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

.... 

私の注釈インターフェース私の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!"); 
    } 
} 

私がしようとしているのは、クラスを受け入れ、基礎となる注釈とその値/属性を明らかにする一般的な方法ですが、私はそれについてすべて間違っていると思います。たとえば、このクラスを(私はBookであるかもしれないし、何か他のものかもしれない)どのように捉え、「これは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を編集しました。思考? –

関連する問題