java注解和通过反射获取注解值

Posted 胡乐天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java注解和通过反射获取注解值相关的知识,希望对你有一定的参考价值。

1.java自带的标准注解

@Override @SuppressWarnings @Deprecated

package com.lt.annotation;

import java.util.ArrayList;
import java.util.List;

/**
 * java自带的标准注解
 * 不写继承类时,会默认继承Object类
 */
public class Test01 extends Object

    /**
     * @Override:覆盖或实现在超类型中声明的方法,即重写
     * 即:该方法与超类的方法名、参数一致
     *      访问权限不能比父类中被重写的访问权限低
     *      返回值类型可以不同,但必须为父类返回值的派生类。
     * @return
     */
    @Override
    public String toString() 
        return super.toString();
    

    /**
     * 镇压警告,可以加载方法上,也可以加载类上
     */
    @SuppressWarnings("all")
    public void test01()
        List list = new ArrayList();
    

    /**
     * 过时的,不推荐使用的方法加上该注解
     */
    @Deprecated
    public static void test02()
        System.out.println("test……");
    
    


2.元注解

元注解:负责解释其他注解

  • @Target:用来限制注解的使用范围
/**
 * 可以看到,Target的参数为一个数组,所以可以写多个值,且参数名有且只有vaule,声明该注解是参数名可以省略
 * 
 * @Target(ElementType.TYPE)——接口、类、枚举、注解
 * @Target(ElementType.FIELD)——字段、枚举的常量
 * @Target(ElementType.METHOD)——方法
 * @Target(ElementType.PARAMETER)——方法参数
 * @Target(ElementType.CONSTRUCTOR) ——构造函数
 * @Target(ElementType.LOCAL_VARIABLE)——局部变量
 * @Target(ElementType.ANNOTATION_TYPE)——注解
 * @Target(ElementType.PACKAGE)——包,用于记录java文件的package信息
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target 
    ElementType[] value();


  • @Retention:表示我们的注解在什么位置还有效(runtime > class > source),一般自定义注解都写runtime
/**
 * @Retention:表示我们的注解在什么位置还有用
 * 可以看到参数类型是:RetentionPolicy
 * 看下源码,它是一个枚举类型,SOURCE CLASS RUNTIME
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention 
    RetentionPolicy value();


  • @Document:表示是否将我们的注解生成在JavaDoc中
  • @Inherited:子类可以继承父类的注解
  • @Repeatable:该注解是Java8新增的注解,用于开发重复注解

3.自定义一个简单注解

/**
 * @Target:声明了该注解可以加到方法、接口、类、枚举、注解上
 * @Retention:声明了该注解在源码、字节码和运行时都有效
 * 
 * 声明了参数为:name,类型为String类型
 */
@Target(value=ElementType.METHOD,ElementType.TYPE)
@Retention(value= RetentionPolicy.RUNTIME)
@interface MyAnnotation
    String name();

4.定义一个注解并获取

①定义注解

@Target(value = ElementType.TYPE,ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface  MyAnnotationTest2
    //注解的参数:参数类型  参数名();
    String name() default "默认值";
    int age() default 0;
    int id() default -1;//如果默认值为-1,代表不存在。

    String[] schools() default "西部开源","清华大学";

②使用注解

/**
 * 自定义注解
 */
@MyAnnotationTest2(name = "乐天")
public class Test03 

    @MyAnnotationTest2(name = "二狗儿",schools = "南大")
    public void test01()

    
    

    @MyAnnotationTest2(name = "鸡蛋儿",schools = "北大")
    public void test02()

    



③获取类上的注解的参数值

/**
 * 获取类上的注解值
 */
public class Test04 
    public static void main(String[] args) 
        //获取该类的Class
        Class<Test03> test03Class = Test03.class;
        //判断该类上是否使用了MyAnnotationTest2注解
        boolean annotation = test03Class.isAnnotationPresent(MyAnnotationTest2.class);
        if(annotation)
            //通过Class获取该类上的注解
            MyAnnotationTest2 myAnnotationTest = test03Class.getAnnotation(MyAnnotationTest2.class);
            System.out.println("name:" + myAnnotationTest.name());
            System.out.println("age:" + myAnnotationTest.age());
            System.out.println("id:" + myAnnotationTest.id());

        

    

输出:

name:乐天
age:0
id:-1

④获取方法上的注解的参数值

/**
 * 获取方法上的注解值
 */
class GetAnnoMethod
    public static void main(String[] args) 
        Method[] declaredMethods = Test03.class.getDeclaredMethods();
        for (Method m : declaredMethods)
            if(m.isAnnotationPresent(MyAnnotationTest2.class))
                System.out.println("name:" + m.getAnnotation(MyAnnotationTest2.class).name());
                System.out.println("age:" + m.getAnnotation(MyAnnotationTest2.class).age());
                System.out.println("id:" + m.getAnnotation(MyAnnotationTest2.class).id());
                System.out.println("school:" + Arrays.toString(m.getAnnotation(MyAnnotationTest2.class).schools()));
                System.out.println("**********************************");
            
        
    

输出:

name:二狗儿
age:0
id:-1
school:[南大]
**********************************
name:鸡蛋儿
age:0
id:-1
school:[北大]
**********************************

以上是关于java注解和通过反射获取注解值的主要内容,如果未能解决你的问题,请参考以下文章

java注解和通过反射获取注解值

java反射机制 怎样获取到类上面的注解

Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

Java反射反射与注解

java通过反射获取加了某个注解的所有的类

java注解使用java获取注解的属性获取注解的字段值