java反射和注解2-自定义注解

对反射有一定了解过后学习注解就会轻松许多,这篇文章会创建创建字段,方法,参数上面的注解,并且通过反射的形式将注解内容拿出来。

下面是自定义注解的简短讲解

1,自定义注解,创建一个只能修饰方法的注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AnnotationMethod {
    String value();
}

注解的写法如下,别问我为什么这么写,规定的

用@interface注解的接口

public @interface AnnotationMethod {
    String value();
}

自定义注解必须有这两个参数

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)

@Retention 注解的生命周期,这里一般用RUNTIME:表示在运行时

@Target注解可以修饰的范围:METHOD表示方法,只有METHOD修饰的只能用在方法上,

接下来多创建几个不同的注解

2,创建一个只能修饰字段的注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AnnotationField {
    String value();
}

3,创建一个只能修饰方法参数的注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface AnnotationParameter {
    String value();
}

4,使用注解

public class AnnotationUser {
    @AnnotationField("field")
    public String name;

    @AnnotationMethod("method")
    public void setName(@AnnotationParameter("Parameter") String name) {
    }
}

5,通过代码获取到类class上的所有注解

 public void start() {
        //反射获取类有多少个字段
        Field[] fields = AnnotationUser.class.getFields();
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            //通过字段的getAnnotations()获取到该字段有多少个注解
            for (Annotation annotation : field.getAnnotations()) {
                //判断字段的注解是不是我们自定义的注解
                if (annotation instanceof AnnotationField) {
                    AnnotationField annotationField = (AnnotationField) annotation;
                    //打印字段的名字
                    Log.e("AnnotationTest", "field name: " + field);
                    //打印字段的注解
                    Log.e("AnnotationTest", "field annotation: " + annotationField.value());
                }

            }
        }

        //反射获取类有多少个方法
        Method[] methods = AnnotationUser.class.getMethods();
        for (Method method : methods) {
            //获取每个方法中有多少个注解
            for (Annotation annotation : method.getAnnotations()) {
                //判断方法的注解是不是我们自定义的注解
                if (annotation instanceof AnnotationMethod) {
                    AnnotationMethod data = (AnnotationMethod) annotation;
                    //打印方法名称
                    Log.e("AnnotationTest", "method Name: " + method.getName());
                    //打印注解
                    Log.e("AnnotationTest", "method annotation: " + data.value());
                }
            }
            //获取每个方法有到少个参数
            for (Parameter parameter : method.getParameters()) {
                //获取每个字段上面所有注解
                for (Annotation annotation : parameter.getAnnotations()) {
                    //判断参数的注解是不是我们自定义的注解
                    if (annotation instanceof AnnotationParameter) {
                        AnnotationParameter data = (AnnotationParameter) annotation;
                        //打印参数名称
                        Log.e("AnnotationTest", "Parameter Name: " + parameter.getName());
                        //打印注解
                        Log.e("AnnotationTest", "Parameter annotation: " + data.value());
                    }
                }
            }


        }
    }

6,这样就可以获取到上面的一个class文件上所有的注解了,打印如下

java反射和注解2-自定义注解_第1张图片

你可能感兴趣的:(java,注解,反射)