zoukankan      html  css  js  c++  java
  • Android AOP之路三 Android上的注解

    一、简单介绍

    啥是注解。不懂的能够先看我上一篇文章。

    在android 里面 注解主要用来干这么几件事:

    • 和编译器一起给你一些提示警告信息。

    • 配合一些ide 能够更加方便快捷 安全有效的编写java代码。

      谷歌出的support-annotations这个库 就是主要干这个的。

    • 和反射一起 提供一些相似于spring 可配置的功能,方便简洁。

    二、Support Annotations栗子

    这里使用官方的一个库,说明在开发中的简单一个应用。

    2.1 导包

    在新建项目的时候会自己主动导的,能够看build.gradle中的依赖dependencies是这种。

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.1.1'
        testCompile 'junit:junit:4.12'
    }
    

    假设没有的话,自己在build.gradle的依赖加入(xx.x.x为你的compileSdkVersion版本):

    compile 'com.android.support:support-annotations:xx.x.x'

    2.2 使用

    这时候就能够使用一些support-annotations提供的注解,以下举一些栗子:

    1、 @NonNull

    test方法參数加入了一个NonNull注解,然后我们传递一个空的參数过去。

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String s = null;
            test(s);
        }
    
        public void test(@NonNull String s){
            System.out.println(s);
        }
    
    }

    IDE就会提示警告

    这里写图片描写叙述

    2、 @StringRes

    再定义testString方法參数加入了一个StringRes注解,然后我们传递一个数字过去。

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            testString(112312);
            testString(R.string.app_name);
        }
    
        public void testString(@StringRes int s){
            System.out.println(s);
        }
    
    }

    IDE就会提示

    这里写图片描写叙述

    三、实现自己的ButterKnife

    经过之前的知识,我们已经知道注解的原理和使用了,这里实现ButterKnife的一个简单功能,View的注入: 一个注解,一个解析器就可以。

    3.1 BindView注解

    
    @Target(ElementType.FIELD)  //解析常量
    @Retention(RetentionPolicy.RUNTIME)  //执行时
    public @interface BindView {
         int value() default -1;  //标识控件
    }
    

    3.2 BindViewParser解析器

    /**
     * Created by Litp on 2017/2/17.
     */
    public class BindViewParser {
    
        /**
         * 传递activty或者View 对象,使用反射获取view变量
         * @param object
         */
        public static void inject(Object object) {
    
            try {
                parse(object);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 解析获取值
         * @param object
         * @throws Exception
         */
        public static void parse(Object object) throws Exception {
    
            final Class<?

    > clazz = object.getClass(); View view = null; //获取clazz的变量。不论private还是public Field[] fields = clazz.getDeclaredFields();

  • 相关阅读:
    heat模板
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode819.Most Common Word最常见的单词
    Leetcode819.Most Common Word最常见的单词
    Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7384011.html
Copyright © 2011-2022 走看看