Java自定义注解及应用

前沿

java目前只内置了三种标准注解

注解解释
@Override 表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示
@Deprecated 如果程序员使用了注解为它的元素,那么编译器会发出警告信息
@Suppress Warnings 关闭不当的编译器警告信息。在Java SE5之前的版本中,也可以使用该注解,不过会被忽略不起作用

四种元注解,元注解专职负责注解其他的注解

元注解解释可选参数
@Target 表示该注解可以用于什么地方。可能的ElementType参数包括 CONSTRUCTOR:构造器的声明,FIELD:域声明(包括enum实例),LOCAL_VARIABLE:局部变量声明,METHOD:方法声明, PACKAGE:包声明,PARAMETER:参数声明,TYPE:类,接口(包括注解类型)或enum声明
@Retention 表示需要在什么级别保存该注解信息。可选的RententionPolicy参数包括 SOURCE:注解将被编译器丢弃器
CLASS:注解在class文件中可用,但会被VM丢弃    
@Document 将此注解包含在javadoc中  
@Inherited 允许子类继承父类中的注解  

自定义注解

  • 第一步,添加自定义注解。
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
    String desc();
    String author();
    int age() default 18;
}
  • 第二步,使用注解
@Description(desc="i am Color",author="boy",age=18)
public String Color() {
    return "red";
}
  • 分析 通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

  • 测试

测试类上的注解

public class ParseAnn {
    public static void main(String[] args) {
        try {
            // 使用类加载器加载类
            Class c = Class.forName("com.test.Child");
            // 找到类上面的注解
            boolean isExist = c.isAnnotationPresent(Description.class);
            // 上面的这个方法是用这个类来判断这个类是否存在Description这样的一个注解
            if (isExist) {
                // 拿到注解实例,解析类上面的注解
                Description d = (Description) c.getAnnotation(Description.class);
                System.out.println(d.value());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

解析方法上的注解

//获取所有的方法
Method[] ms = c.getMethods();
// 遍历所有的方法
for (Method m : ms) {
    boolean isExist1 = m.isAnnotationPresent(Description.class);
    if (isExist1) {
        Description d1=m.getAnnotation(Description.class);
        System.out.println(d1.value());
    }
}
  • 注解的应用结构图

参考文献

Java自定义注解及应用

posted @ 2019-07-20 15:58  天涯海角路  阅读(155)  评论(0)    收藏  举报