2016-08-14 4 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!"); 
    } 
} 

То, что я пытаюсь сделать, это сделать общий метод, который принимает класс, и сможет ли он раскрывать основные аннотации и их значения/атрибуты, но я думаю, что все это неправильно. Например, как я мог бы взять в этом классе (может быть, книга, может быть что-то еще), и иметь возможность определить «Это имя таблицы, это переменные-члены, которые мы определили как базы данных, это настройки, которые мы установили для этих полей»и т.д.

+0

Боковое примечание: [Статья Мартина Фаулера об ОРМ-ненависти] (http://martinfowler.com/bliki/OrmHate.html) является хорошим показателем для тех, кто рассматривает возможность «сворачивания своих собственных» ОРМ. –

+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. Мысли? –

Смежные вопросы