简单学习自定义注解 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