andorid注解使用

2019-08-07  本文已影响0人  ghost9527

最近使用retrofit时,发现其使用了大量的注解,联想以前的butterknife等,发现注解也是很好用与有意思的东西,这里就做下记录,方便自己以后使用。

1、注解的定义

注解大致意义就是对一个方法与数据进行描述,打个比方如果一个方法过时了提示用户可以再方法之上加上@Deprecated,这样编辑器中的方法就会画上横线如下:

示例图
通过源码我们也会发现注解必须使用@interface来描述。

2、注解大致分类

2.1运行时注解(Runtime)

通过反射机制运行处理的注解

2.2编译时注解(Compile time)

通过注解处理器生成编译时文件预先处理

3、元注解

原始的注解,用来给注解进行注解的注解。

@Retention:定义注解的保留策略

public enum RetentionPolicy {
    /**
     * 注解仅存在于源码中,在class字节码文件中不包含,只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings
     */
    SOURCE,

    /**
     * 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,在编译时进行一些预处理操作,比如生成一些辅助
     * 代码(如 ButterKnife)
     */
    CLASS,

    /**
     * 注解会在class字节码文件中存在,在运行时可以通过反射获取到,需要在运行时去动态获取注解信息
     */
    RUNTIME
}

@Target:定义注解的作用目标

public enum ElementType {
    /** 接口、类、枚举、注解*/
    TYPE,

    /** 字段声明(包括枚举常量) */
    FIELD,

    /** 方法声明 */
    METHOD,

    /** 方法参数声明*/
    PARAMETER,

    /** 构造函数声明 */
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注解类型声明 */
    ANNOTATION_TYPE,

    /** 包声明 */
    PACKAGE,

    /**
     * 泛型参数声明
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 泛型使用
     * @since 1.8
     */
    TYPE_USE
}

@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解

3、如何自定义注解

首先要创建一个注解

@Documented
@Target(ElementType.TYPE)//声明类之上
@Retention(RetentionPolicy.RUNTIME)//运行时
public @interface setContentView {
    int value();//需要的参数,int类型
}

之后再activity的类名上添加注解

@setContentView(R.layout.activity_main)
public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AnnotationUtil.setContentView(this);//反射获取注解参数并添加布局
    }
}

最后是工具类

public class AnnotationUtil {

    public static void setContentView(Activity activity) {
        Class a = activity.getClass();
        if (a.isAnnotationPresent(setContentView.class)) {
            // 得到activity这个类的ContentView注解
            setContentView contentView = (setContentView) a.getAnnotation(setContentView.class);
            // 得到注解的值
            int layoutId = contentView.value();
            // 使用反射调用setContentView
            try {
                Method method = a.getMethod("setContentView", int.class);
                method.setAccessible(true);
                method.invoke(activity, layoutId);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
}

效果图就不放了,通过这些可以实现很多方便快捷的操作,类如findviewbyid通过注释减少代码量等等。
其他的一些注解大家可以去网上查阅或者源码中查看,主要都是api提供的,如java.langjava.lang.annotationjava.annotationandroid.annotationandroid.support.annotation中的注解等等。不少三方库中也有注解使用。

上一篇下一篇

猜你喜欢

热点阅读