Java中自定义Annotation

本篇主要通过一个例子来了解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的理解。

猜你喜欢

转载自blog.csdn.net/wei_lei/article/details/77624036