(安卓)Annotation(注解)实例

Annotation就是注解了,JDK1.5新增加功能,该功能可用于类,构造方法,成员变量,方法,参数等的声明中。
常见的比如说@Override,表明这个方法是重写了父类的方法,以及我们在调用api的时候,时不时会看到某个方法被画上了横线
这里写图片描述
其实就是这个方法用@Deprecated进行了注解,表明这个方法不再推荐使用

@Deprecated
public int getSeconds() {
     return normalize().getSeconds();
}

归纳而言,Android中的注解大概有以下好处
1、提高我们的开发效率
2、更早的发现程序的问题或者错误
3、更好的增加代码的描述能力
4、更加利于我们的一些规范约束
5、提供解决问题的更优解

下面看看我们怎么定义并使用注解,定义注解我们需要使用关键字@interface,最简单的注解类

public @interface MyAnnotation {
}

然后通常我们会给注解类添加两个注解:
@Target
@Retention

@Target:表明我们的注解所修饰的对象范围,他的可选值放在了java.lang.annotation.ElementType中,定义时可以选择多个,用逗号隔开,分别为
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention:定义了该Annotation被保留的时间长短,在java.lang.annotation.RetentionPolicy中,分别为
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)

我们自己定义的一般都会选择RUNTIME,而默认的则是CLASS

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

接下来我们还可以在里面定义方法,返回值类型为基本类型、Class、String、enum、Annotation以及以上所有类型的数组,不可以有参数,可以用default来设置默认值

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String value();

    int length() default 2;
}

接下来我们就可以在代码中使用了,我们定义的注解可选的修饰对象为METHOD(方法),FIELD(域),PARAMETER(参数),我们这里就修饰下FILED,定义一个String来修饰

public class MainActivity extends AppCompatActivity {

    @MyAnnotation("value")
    String value;

    @MyAnnotation(value = "value2", length = 1)
    String value2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

因为length有默认值,所以我们可以不设置,如果只有一个值需要设置的话,我们可以直接写值,但是如果有两个及以上的值需要设置,那么我们就需要将名称和值都写上
我们接下来定义一个类,采用反射的方式将注解的值取出并使用

public class AnnotationParse {

    public static void parse(Object o) {
        Class<?> mClass = o.getClass();
        Field[] fields = mClass.getFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(MyAnnotation.class)) {
                MyAnnotation myAnnotation = field.getAnnotation(MyAnnotation.class);
                String value = myAnnotation.value();
                int length = myAnnotation.length();
                try {
                    field.set(o, value + "---" + length);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在Activity中调用解析方法并打印

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AnnotationParse.parse(this);
        Log.e("MainActivity", value);
        Log.e("MainActivity", value2);
    }

打印结果为
这里写图片描述
可见我们顺利的完成了解析,以上就是注解的使用方式。

源码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值