简单学习自定义注解 Annotation

作者: 鲨鱼尤德曼 | 来源:发表于2020-07-09 14:01 被阅读0次

    何为注解

    Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据。
    Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注。

    Android中常见的注解,如下

    • @Nullable - 作用于函数参数或者返回值,标记参数或者返回值可以为空。
    • @NonNull - 作用于函数参数或者返回值,标记参数或者返回值不可以为空。
    • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
    • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
    • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
      等…………

    注解在Android中应用非常广泛,你一定用到过

     @Bind(R.id.mip_edit)
        EditText mip_edit;
    
    @Bind(R.id.tv_bar_right)
        TextView tv_bar_right;
    

    没错,Butterknife就是自定义的注解,我们也可以自定义一个简单的页面跳转注解

    步骤

    1. 创建注解文件
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface GetResId {
                @IdRes int value();
    }
    

    创建一个Annotation文件,并用@Target注解标志这个自定义注解的使用范围,这里要在变量中使用,所以用ElementType.FIELD; @Retention指示带注解类型的注解要保留多长时间。如果在注解类型声明中没有保留注解,则保留策略默认为RetentionPolicy.CLASS。这里我们只需要在运行时RetentionPolicy.RUNTIME

    1. 在Activity中设置
    @GetResId(R.id.tv_show)
        private TextView textView;
    @GetResId(R.id.tv_show2)
        private TextView textView2;
    @GetResId(R.id.btn_goto)
      private Button btnGoto;
    
     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main_annotation);
            ctx = this;
            InjectUtils.inject(this);
            textView.setText("First Page");
            textView2.setText("第一页");
            btnGoto.setOnClickListener(v -> startActivity(InjectUtils.mIntent));
        }
    

    如果第一步没问题,这里获取View则没有问题不会报错,并且btnGoto可以监听点击事件。
    就这么容易完结了吗?还没完。InjectUtils.inject(this) 这行代码才是这里的重点。

    1. 反射获取注解
                public static void inject(Activity activity) {
                            Class<? extends Activity> activityClass = activity.getClass();
                            Field[] fields = activityClass.getDeclaredFields();
                            for (Field field : fields) {
                                        if (field.isAnnotationPresent(GetResId.class)) {
                                                    GetResId kurode = field.getAnnotation(GetResId.class);
                                                    if (kurode == null) {
                                                                return;
                                                    }
                                                    int res = kurode.value();
                                                    View tvView = activity.findViewById(res);
                                                    field.setAccessible(true);
                                                    try {
                                                                field.set(activity, tvView);
                                                    } catch (IllegalAccessException e) {
                                                                e.printStackTrace();
                                                    }
                                        }
                                }}
    

    这里是具体的反射代码,整个自定义注解的精髓所在

    通过自定义注解实现点击事件的效果图

    自定义注解

    如有补充请多多评论促进交流!

    相关文章

      网友评论

        本文标题:简单学习自定义注解 Annotation

        本文链接:https://www.haomeiwen.com/subject/ognhcktx.html