android开发技巧

Android 开发也要掌握的Java知识 - Java注解

2020-08-17  本文已影响0人  进击的包籽

1.注解的定义

2.注解是什么样的

package java.lang.annotation;
 
public interface Annotation {
    boolean equals(Object obj);
 
    int hashCode();
 
    String toString();
 
    Class<? extends Annotation> annotationType();
}
@Override image.png

3.注解的分类以及作用

注解的分类

4.注解写法

//作用在什么地方:类、接口、方法、属性变量
@Target({ElementType.TYPE,ElementType.METHOD, ElementType.FIELD})
//生命周期在运行时
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
        //如果使用value,用的时候可以是  “value = 111”,也可以直接写 “111”
        int value();   
}
 
@TestAnnotation(111)
private int num1;
 
@TestAnnotation(value = 111)
private int num2;
//作用在什么地方:类、接口、方法、属性变量
@Target({ElementType.TYPE,ElementType.METHOD, ElementType.FIELD})
//生命周期在运行时
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
        //如果使用value,用的时候可以是value = 111,也可以直接写 111
        int value();

        //自己创建一个data1参数,就要写value = 111, data1 = "111",且前面value也要写全
        String data1();

        //如果有default默认值,可以不写这参数,也能加上data2 = "222"修改参数
        String data2() default "222";
}


@TestAnnotation(value = 111,data1 = "111")
private int num1;

@TestAnnotation(value = 111,data1 = "111",data2 = "333")
private int num2;

5.注解使用

5.1 过时标记
5.2 语法检查
public class WeekDay {
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;

    //有效期在源码阶段,用于语法校验
    @Retention(RetentionPolicy.SOURCE)
    //该注解修饰属性、修饰方法参数
    @Target({ElementType.FIELD, ElementType.PARAMETER})
    //传入的类型只能是这几个
    @IntDef({MONDAY, TUESDAY, WEDNESDAY})
    public @interface WeekDayAnnotation {

    }
}
语法检查
5.3 findViewById
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectView {
    @IdRes int value();
}
 
/*--------------------------------------------------------*/
 
 
public class InjectViewUtils {
    public static void injectView(Activity activity) {
        Class<? extends Activity> clazz = activity.getClass();
 
        //获取成员
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            //判断是否被打上了InjectView注解标签
            if (field.isAnnotationPresent(InjectView.class)) {
                InjectView injectView = field.getAnnotation(InjectView.class);
                //获取View的id
                int id = injectView.value();
                View view = activity.findViewById(id);
 
                //反射设置值
                //设置权限,允许修改private的属性
                field.setAccessible(true);
                try {
                    field.set(activity,view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
@InjectView(R.id.tvTest)
private TextView tvTest;

@InjectView(R.id.tvTest2)
private TextView tvTest2;

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

    InjectViewUtils.injectView(this);
}
5.4 View的Onclick
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectOnClick {
   @IdRes int[]  value();
}
 
/*------------------------------------------------------*/
 
/**
 * 点击事件处理
 */
public class OnClickUtils {
    static public void inject(final Activity activity) {
        Class<? extends Activity> clazz = activity.getClass();
 
        //获取所有方法
        Method[] methods = clazz.getDeclaredMethods();
        for (final Method method : methods) {
            //判断方法的注解类型
            if (method.isAnnotationPresent(InjectOnClick.class)) {
                InjectOnClick injectOnClick = method.getAnnotation(InjectOnClick.class);
                //获取id参数数组
                int[] ids = injectOnClick.value();
 
                //设置权限,可以修改private
                method.setAccessible(true);
                for (int id : ids) {
                    //每个id都设置
                    activity.findViewById(id).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            //调用方法回传
                            try {
                                method.invoke(activity);
                            } catch (Exception e) {
                                e.printStackTrace();
                                try {
                                    method.invoke(activity, v);
                                } catch (Exception ex) {
                                    ex.printStackTrace();
                                }
                            }
                        }
                    });
                }
            }
        }
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    OnClickUtils.inject(this);
}

@InjectOnClick({R.id.tvTest, R.id.tvTest2})
private void OnClick(View view) {
    int id = view.getId();
    if (id == R.id.tvTest) {

    } else if (id == R.id.tvTest2) {

    }
}

6.结尾

上一篇 下一篇

猜你喜欢

热点阅读