美文网首页
andorid注解使用

andorid注解使用

作者: ghost9527 | 来源:发表于2019-08-07 11:24 被阅读0次

    最近使用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中的注解等等。不少三方库中也有注解使用。

    相关文章

      网友评论

          本文标题:andorid注解使用

          本文链接:https://www.haomeiwen.com/subject/vntodctx.html