我正在尝试将注释应用到的当前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;等
答案 0 :(得分:0)
Oracle有一些很好的文档: https://docs.oracle.com/javase/tutorial/java/annotations/ http://www.oracle.com/technetwork/articles/hunter-meta-2-098036.html
主题很复杂,有很多步骤,因此不适合此处的快速摘要。您使用@interface TypeName
声明了一种特殊的接口,并填充了一些逻辑,通常使用反射。
在向客户发布代码之前,您应该仔细研究并练习。