本篇主要通过一个例子来了解Java中的关于自定义Annotation机制,我们自定义一个注释Click,用于给View设置点击事件。
首先看Annotation的定义:
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface Click {
int value();
}
@Target(Element.METHOD)表示该注释作用的对象是成员方法;@Retention(RetentionPolicy.CLASS)代表编译器把注释信息记录在class文件中,当运行Java程序时,JVM不可获取注释信息,这是默认值。
再看主程序:
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Apm.execute(this);
}
@Click(R.id.button)
void onAction() {
Log.e("MainActivity", "--------============");
}
}
Apm是我们自定义的注释处理器,它的定义如下:
public class Apm{
public static void execute(final Activity context) {
Class clazz = context.getClass();
Method[] methods = clazz.getDeclaredMethods();
for(final Method method : methods) {
Click click = method.getAnnotation(Click.class);
if(click != null) {
int id = click.value();
View view = context.findViewById(id);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
method.invoke(context);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}
先通过反射获取所有的方法,遍历所有的方法查找有Click注释的方法,再通过反射调用这个方法。整个逻辑挺简单的,主要通过这个例子加深对Annotation的理解。