美文网首页springboot
java 获取类,属性变量,方法,方法参数上注解的值等

java 获取类,属性变量,方法,方法参数上注解的值等

作者: 666swb | 来源:发表于2018-07-09 20:47 被阅读301次

一:获取类上注解的值

定义注解@Target(ElementType.TYPE)用于类,接口等

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Orange {

    String getName();

    String getValue();
}

获取

@Orange(getName = "3333",getValue = "4444")
public class ParameterNameTest {

   。。。

    @Test
    public void main() throws Exception {

        Class<ParameterNameTest> clazz = ParameterNameTest.class;

        if(clazz.isAnnotationPresent(Orange.class)){
            // 获取 "类" 上的注解
            Orange getAnnotation = clazz.getAnnotation(Orange.class);
            System.out.println("\"类\"上的注解值获取到第一个 :"
                    + getAnnotation.getName()+ ",第二个:"+ getAnnotation.getValue());
        }
}

返回

"类"上的注解值获取到第一个 :3333,第二个:4444

二:获取属性变量上注解的值

定义注解@Target(ElementType.FIELD)用于属性变量

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Banana {

    String length();
    String price();
}

获取

public class ParameterNameTest {

    @Banana(length = "6666", price = "$888")
    String something = "other information";

    @Test
    public void main() throws Exception {

        Class<ParameterNameTest> clazz = ParameterNameTest.class;
         // 获取 "属性变量" 上的注解的值
        Field[] fields = clazz.getDeclaredFields();
        for(Field field: fields){
            if(field.isAnnotationPresent(Banana.class)){
                Banana bananaAnnotation = field.getAnnotation(Banana.class);
                System.out.println("\"属性变量\"上的注解值获取到第一个 :"
                        + bananaAnnotation.length()+ ",第二个:"+ bananaAnnotation.price());
            }
        }
    }
}

返回

"属性变量"上的注解值获取到第一个 :6666,第二个:$888

三: 获取方法上注解的值

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Apple {

    String color();

    String number();
}

获取

public class ParameterNameTest {

    @Apple(color = "红色", number = "5555")
    public void method1(){
        // ...
    }

    @Test
    public void main() throws Exception {

        Class<ParameterNameTest> clazz = ParameterNameTest.class;

        // 获取 "方法"上的注解的值
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method: methods){
            if(method.isAnnotationPresent(Apple.class)){

                Apple appleAnnotation = method.getAnnotation(Apple.class);
                System.out.println("\"方法\"上的注解值获取到第一个 :"
                        + appleAnnotation.color()+ ",第二个:"+ appleAnnotation.number());
            }
        }
    }
}

返回

"方法"上的注解值获取到第一个 :红色,第二个:5555

三: 获取" 方法参数 " 上注解的值

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Cherry {

    String value();
}

获取

public class ParameterNameTest {

   public void method2(@Cherry("1111") String param1, @Cherry("2222") String param2) {
        System.out.println(param1 + param2);
    }

    @Test
    public void main() throws Exception {

        Class<ParameterNameTest> clazz = ParameterNameTest.class;
        // 获取 "方法参数" 上的注解的值
        Method method = clazz.getDeclaredMethod("method2", String.class, String.class);
        String[] parameterNames = getMethodParameterNamesByAnnotation(method);
        System.out.println("\"方法参数\"上的注解值获取到"+Arrays.toString(parameterNames));
    }

    /**
     * 获取给 "方法参数" 进行注解的值
     *
     * @param method 要获取参数名的方法
     * @return 按参数顺序排列的参数名列表
     */
    public static String[] getMethodParameterNamesByAnnotation(Method method) {
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        if (parameterAnnotations == null || parameterAnnotations.length == 0) {
            return null;
        }
        String[] parameterNames = new String[parameterAnnotations.length];
        int i = 0;
        for (Annotation[] parameterAnnotation : parameterAnnotations) {
            for (Annotation annotation : parameterAnnotation) {
                if (annotation instanceof Cherry) {
                    Cherry param = (Cherry) annotation;
                    parameterNames[i++] = param.value();
                }
            }
        }
        return parameterNames;
    }
}

返回

"方法参数"上的注解值获取到[1111, 2222]

小结:主要使用的API是Class类中的实现接口AnnotatedElement的方法

isAnnotationPresent --- 检测该元素是否被对应注解修饰

default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
        return getAnnotation(annotationClass) != null;
    }

getAnnotation --- 获取注解对象

<T extends Annotation> T getAnnotation(Class<T> annotationClass);

相关文章

  • java 获取类,属性变量,方法,方法参数上注解的值等

    一:获取类上注解的值 定义注解@Target(ElementType.TYPE)用于类,接口等 获取 返回 二:获...

  • 反射

    一、 注解的定义反射是通过class文件对象获取java类的构造方法、成员方法、属性、静态代码块等。二、使用 获取...

  • @ModelAttribute 获取方法参数值中的坑

    通过@ModelAttribute注解在方法参数上,获取请求中的值,注意所注解的参数是否有无参构造函数。下面思考一...

  • 基本Annotation

    java中的类注解可以用来修饰如下元素:类,成员方法,成员变量,构造函数,形参,局部变量,接口。 类注解不会对程序...

  • Java进阶-注解@Annotation

    概念 Java 语言中的类、方法、变量、参数和包等都可以被注解修饰。通过反射获取注解内容。在编译器生成类文件时,注...

  • Java基础之Final

    Final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。 Final...

  • Java注解

    一、注解介绍 Java注解(Annotation)又称 Java 标注。Java 语言中的类、方法、变量、参数和包...

  • 简单理清java反射、注解、依赖注入/依赖查找、控制反转的关系。

    1.反射(Reflection):让我们在运行时获取类的属性、方法、构造方法、父类、接口等信息。2.注解(Anno...

  • OC对象内存布局

    Q: 属性、变量、变量的值、类方法、对象方法怎么布局?元类、类对象、实例对象、根类之间的关系? A: 属性(包括父...

  • Java final总结

    final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。 1. fi...

网友评论

    本文标题:java 获取类,属性变量,方法,方法参数上注解的值等

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