如何传递/访问注释信息?

时间:2016-08-14 19:50:51

标签: java android orm annotations

我正在尝试将注释应用到的当前Book类的示例:

@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!");
    }
}

我想要做的是制作一个接受类的通用方法,让它能够发现底层注释及其值/属性,但我认为我认为这一切都是错误的。例如,我将如何接受这个类(可能是一本书,可能是其他的东西),并且能够确定&#34;这是tableName,这些是我们定义为DatabaseFields的成员变量,这些是我们为这些字段设置的设置,&#34;等

1 个答案:

答案 0 :(得分:0)

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

主题很复杂,有很多步骤,因此不适合此处的快速摘要。您使用@interface TypeName声明了一种特殊的接口,并填充了一些逻辑,通常使用反射。

在向客户发布代码之前,您应该仔细研究并练习。