美文网首页
Java Annotations

Java Annotations

作者: ZozoSpider | 来源:发表于2018-10-09 11:38 被阅读0次

Java常见注解

JDK自带注解

  • @Override:重写
  • @Deprecated:过时
  • @Suppvisewarnings:忽略警告

常见第三方注解 > Spring

  • @Autowired
  • @Service
  • @Respository

常见第三方注解 > Mybatis

  • @InsertProvider
  • @UpdateProvider
  • @Options

注解分类

按照运行机制分

  • 源码注解:注解只在源码中存在,编译成.class文件就不存在了。
  • 编译时注解:注解在源码和.class文件中都存在。(@Override,@Deprecated,@Suppvisewarnings)
  • 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑。(@Autowired)

按照来源分

  • 来自JDK的注解
  • 来自第三方的注解
  • 自定义的注解

元注解

自定义注解

自定义注解语法要求

  • 使用@interface关键字定义注解。
  • 成员以无参无异常方式声明,可以用default为成员指定一个默认值,成员类型是受限制的,包括基本数据类型,String,Class,Annotation,Enumeration。
  • 如果注解只有一个成员,则成员必须取名为value(),在使用时可以忽略成员名和赋值号(=)。
  • 注解类可以没有成员,没有成员的注解称为标识注解。
  • 元注解 @Target:注解的作用域,包括CONSTRUCTOR(构造方法声明),FIELD (字段声明),LOCAL_VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类,接口)。
  • 元注解 @Retention:注解的生命周期,包括SOURCE(只在源码显示,编译时会丢弃),CLASS(编译时会记录到class中,运行时忽略),RUNTIME(运行时存在,可以通过反射读取)。
  • 元注解 @Inherited:允许子类继承。
  • 元注解 @Documented:生成javadoc时会包含注解。
import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {

    String desc();
    String author();
    int age() default 18;

}

使用自定义注解

<注解名>(<成员名1> = <成员值1>, <成员名2> = <成员值2>, ...)

    @Description(desc = "hello desc", author = "tom", age = 19)
    public void test() {
        
    }

解析注解

通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序的逻辑。
子类注解优先级高于父类注解。

  • 定义注解
import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description2 {

    String value();

}
  • 引用注解
@Description2("I am class Person annotation")
public class Person {

    @Description2("I am class Person : method name annotation")
    public String name() {
        return null;
    }

    @Description2("I am class Person : method age annotation")
    public int age() {
        return 0;
    }

    public void sing() {

    }

}

@Description2("I am class Man annotation")
public class Man extends Person {

    @Override
    @Description2("I am class Man : method name annotation")
    public String name() {
        return super.name();
    }

}
  • 解析注解 & 运行结果
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) throws ClassNotFoundException {

        // 使用类加载器加载类
        Class<?> c = Class.forName("annotation.Man");

        // 找到类上面的注解
        boolean isPresent = c.isAnnotationPresent(Description2.class);

        // 获取注解实例
        if (isPresent) {
            Description2 desc2 = c.getAnnotation(Description2.class);
            System.out.println(desc2.value());
        }

        // 找到方法上的注解
        Method[] methods = c.getMethods();

        // 获取注解实例 1
        for (Method method : methods) {
            boolean isMPresent = method.isAnnotationPresent(Description2.class);
            if (isMPresent) {
                Description2 mDesc2 = method.getAnnotation(Description2.class);
                System.out.println("1:" + mDesc2.value());
            }
        }
        // 获取注解实例 2
        for (Method method : methods) {
            Annotation[] annotations = method.getAnnotations();
            for (Annotation annotation : annotations) {
                if (annotation instanceof Description2) {
                    Description2 desc2 = (Description2) annotation;
                    System.out.println("2:" + desc2.value());
                }
            }
        }
    }

}
I am class Man annotation
1:I am class Man : method name annotation
1:I am class Person : method age annotation
2:I am class Man : method name annotation
2:I am class Person : method age annotation

相关文章

网友评论

      本文标题:Java Annotations

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