文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android 注解解析及使用

2022-06-06 14:00

关注

目录

一、注解解析。

1.什么是注解?

2.为什么要使用注解?

3.android中常见的注解有哪些?

4.元注解。

二、注解使用。

1.如何实现一个注解?

2.android中注解示例。

一、注解解析。 1.什么是注解?

注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释代码的一部分。注解对于代码的运行效果没有直接影响。

通俗易懂点讲,注解就是一种标签,对类、方法、属性等赋予的一种代码级解释,对代码的运行效果没有丝毫影响。

那么问题来了,既然对代码没有丝毫影响,为什么要用它呢?我们带着问题来进行下面的阅读。

2.为什么要使用注解? 通过注解中的参数值,进行条件判断来处理对应的逻辑。 通过注解可以处理一些有规律性的代码处理,简化代码,比如我们一直重复写的findViewById问题。 通过注解我们可以自动生成一些代码,比如我们用的greendao,这样自动生成,既可以避免错误,又让代码简洁。

下面我们会讲到一些注解的实际使用场景,大家先了解注解的一些概念及方法。

3.android中常见的注解有哪些?

下面我们来讲一下android中常见的注解,带大家先有个基本认识。

@override:当子类重写父类的方法时,用于标识继承自父类的方法。

@deprecate:用于标记一些过时的方法,相信大家都不陌生,比如我们调用一些过时的api,中间会有一条删除线。

@SupressWarnings: 忽略警告。all表示忽略全部警告。

4.元注解。

元注解是用于注解注解的注解。

听起来可能有点拗口,元注解就是在我们定义的注解上添加的注解即为元注解,元注解一共有四个,大家别慌,我们一个一个来看。

1.@Retention

该注解用于标识我们的定义的注解的过期时间。一共有三个值:

RetentionPolicy.SOURCE:源码阶段,就是说我们在代码编写阶段有效。

RetentionPolicy.CLASS:编译阶段,代码编译前有效。

RetentionPolicy.RUNTIME:运行时阶段,代码会一直有效,生命周期很长。

2.@Target

该注解用于标识我们定义的注解的使用场景,比如方法名上,类上等。下面是它可以使用场景的值:                  ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

3.@Documented

文档相关,将注解中的元素包含到 Javadoc 中去。

4.@inherit

如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

二、注解使用。 1.如何实现一个注解?

我们想自定义一个注解的话,跟接口类似,用关键字@interface。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
    int getAge() default 0; //方法可以设置默认值
}

上面我们一定一个注解为MyAnnotation,定义这个注解我们使用场景为给属性添加并且一直有效。

那么我们接下来使用这个注解,我们定义个user类。

public class User {
    @MyAnnotation(getNum = 20)
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

我们给字段属性age设置了注解,并且值为20;那么我们接下来实现代码获取到这个20.

public static void main(String[] args) throws NoSuchFieldException {
        //获取user类对象
        Class userClass = User.class;
        //获取user类的age属性值
        Field ageField = userClass.getDeclaredField("age");
        //判断该属性值是否包含MyAnnotation注解
        boolean isExit = ageField.isAnnotationPresent(MyAnnotation.class);
        if (isExit){
            //如果包含,获取到注解
            MyAnnotation annotation = ageField.getAnnotation(MyAnnotation.class);
            //获取到注解值
            int num = annotation.getNum();
            System.out.println("num:" + num);
        }
    }

这里需要将几个重要方法:

isAnnotationPresent(Annotation.class):该方法判断是否包含此注解,可以用在类,属性,方法等。

getAnnotation(Annotation.class):该方法获取此注解对象。

那么我们通过上面的例子,基本上是可以使用注解了。下面我们来讲几个android中常用的例子。

2.android中注解示例。

我们android中注解,比如Butterknife,Evenbus,GreenDao等。

我们来自己实现一下Butterknife。

首先定义我们的注解,一共俩个,@BindView、@BindLayout.

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface BindView {
    int value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BindLayout {
    @LayoutRes
    int value();
}

我们定义了俩个注解,通过名字大家也可以看出,一个为绑定view,一个绑定布局xml。

下面我们来实现activity添加注解。

@BindLayout(R.layout.activity_main)
public class MainActivity extends BaseActivity {
    @BindView(value = R.id.tv)
    TextView textView;
    @Override
    void create(){
        textView.setTextColor(Color.parseColor("#ff0000"));
    }
}

也很简单,我们给textview控件添加id注解,并且oncreate初始化时进行文本变色,给activity添加了布局文件xml申明的注解。

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bindLayout();
        bind();
        create();
    }
    abstract void create();
    protected void bind(){
        Class aClass = this.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field field : declaredFields){
            boolean isExit = field.isAnnotationPresent(BindView.class);
            if (isExit){
                BindView annotation = field.getAnnotation(BindView.class);
                int resId = annotation.value();
                try {
                    Method method = aClass.getMethod("findViewById", int.class);
                    method.setAccessible(true);
                    Object invoke = method.invoke(this, resId);
                    field.setAccessible(true);
                    field.set(this,invoke);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    protected void bindLayout(){
        Class aClass = this.getClass();
        BindLayout bindLayout = (BindLayout) aClass.getAnnotation(BindLayout.class);
        if (bindLayout != null){
            int layoutId = bindLayout.value();
            try {
                Method method = aClass.getMethod("setContentView", int.class);
                method.setAccessible(true);
                method.invoke(this, layoutId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

我们的BaseActivity中做了绑定view跟layout的初始化操作,通过反射来获取到setContentView方法跟findViewById方法进行设置我们的注解值的。代码很全很清晰,如果大家有不清楚的,可以参考我的下一篇,反射篇。

如果帮到大家,请大家帮忙点个赞,大家的关注和支持是我坚持下去的动力。


作者:积水成渊,蛟龙生焉


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯