欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈Android注解在日常开发中的简单使用

程序员文章站 2024-01-03 11:11:10
...

    注解一词,你第一眼看过去可能会误解为是注释,其实不然,在Java技术中它是属于一个单独的功能分类模块,它有其独特的使用功能,接下我们就来先看一下Java中的注解:

一、Java注解

    我们简单来看下java的注解功能:

    适用场景——通过的类的反射获取类的方法和属性

 

    java中元注解有四个: @Retention @Target @Document @Inherited;

 @Retention:注解的保留位置         

 @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含

 @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,

 @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

  

 @Target:注解的作用目标        

        @Target(ElementType.TYPE)   //接口、类、枚举、注解

   @Target(ElementType.FIELD) //字段、枚举的常量

   @Target(ElementType.METHOD) //方法

   @Target(ElementType.PARAMETER) //方法参数

   @Target(ElementType.CONSTRUCTOR)  //构造函数

   @Target(ElementType.LOCAL_VARIABLE)//局部变量

   @Target(ElementType.ANNOTATION_TYPE)//注解

   @Target(ElementType.PACKAGE) ///   

 

     @Document:说明该注解将被包含在javadoc中

 

   @Inherited:说明子类可以继承父类中的该注解

 

二、简单Demo

    这个示例主要是获取一个JavaBean的类和属性的注解值。

    1、我们首先编写一个类的注解类,代码如下:

    

package wufq.com.annotationtest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Author:wufq on 2018/5/31 15:27
 * Email:aaa@qq.com
 *
 * @TODO:
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamType {
    String value();
}

结合第一小部分的知识点,ElementType.TYPE用来注解类的,另外RetentionPolicy.RUNTIME注解在class字节码文件中,并且运行时可通过反射获取到。接下来我们看来属性的注解类:

    2、属性注解类

   

package wufq.com.annotationtest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Author:wufq on 2018/5/31 15:29
 * Email:aaa@qq.com
 *
 * @TODO:
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamFiled {
    String value();
}

同理,我们可以知道ElementType.FIELD用来注解属性的,另外RetentionPolicy.RUNTIME注解在class字节码文件中,并且运行时可通过反射获取到。

    3、JavaBean类

package wufq.com.annotationtest;

/**
 * Author:wufq on 2018/5/31 15:30
 * Email:aaa@qq.com
 *
 * @TODO:
 */
@ParamType("tb_student")
public class Student {
    @ParamFiled("tb_name")
    public String name;
    @ParamFiled("tb_sex")
    public String sex;
    @ParamFiled("tb_age")
    public String age;
    @ParamFiled("tb_schoolName")
    public String schoolName;

    public Student(String name, String sex, String age, String schoolName) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.schoolName = schoolName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }
}

从上面我们可以看出,代码中分别用类注解和属性注解标记了JavaBean,也即是Student类,没什么好说的,我们直接看调用的地方吧。

    4、客户端

package wufq.com.annotationtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.lang.reflect.Field;

public class MainActivity<T> extends AppCompatActivity {

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

//        Student student = new Student("张三","男","90","扬名中学");

    }

    public void load(View view){
        Class<Student> cz = Student.class;
        init(cz);
    }

    private void init(Class<Student> clazz){
        String result;
        if(clazz.getAnnotation(ParamType.class) == null){
            result = clazz.getClass().getSimpleName();
        } else {
            result = clazz.getAnnotation(ParamType.class).value();
        }
        Log.i("wufq","result == "+result);

//        String filed;
//        if (clazz.getAnnotation(ParamFiled.class) == null){
//            filed = clazz.getClass().getSimpleName();
//        } else {
//            filed = clazz.getAnnotation(ParamFiled.class).value();
//        }
//        Log.i("wufq","filed == "+filed);

//        Annotation[] annotations = clazz.getAnnotations();
//        if (annotations != null && annotations.length > 0){
//            for (Annotation annotation : annotations) {
//                Log.i("wufq","annotation == "+annotation.toString());
//            }
//        }

        Field fields [] = clazz.getFields();
        if (fields != null && fields.length > 0){
            for (Field field : fields){
                field.setAccessible(true);
            }

            String fieldName;
            for (Field field : fields){
                if (field.getAnnotation(ParamFiled.class) == null){
                    fieldName = field.getName();
                } else {
                    fieldName = field.getAnnotation(ParamFiled.class).value();
                }

                Log.i("wufq","fieldName == "+fieldName);
            }


        }
    }
}

我们运行下代码,结果打印如下:

浅谈Android注解在日常开发中的简单使用

当然前提是Student的属性必须是public的。

好了,注解就简单讲了下,讲得不好的地方请多多指教。浅谈Android注解在日常开发中的简单使用

 

 

程序员下班休闲看电影的好地方,全网免vip,扫码关注:

浅谈Android注解在日常开发中的简单使用

 

 

 

 

上一篇:

下一篇: