java注解


1.分类
  1.1 按运行机制分类
     1.1.1 源码注解SOURCE:只有源码中存在,编译后的class文件中就不存在了
     1.1.2 编译时注解CLASS:在源码和class文件中都存在
     1.1.3 运行时注解RUNTIEM:运行时存在
  1.2 按来源分类
     1.2.1 来自JKD的注解,如:@Override,@Deprecated等
     1.2.2 来自第三方的注解,如:@AutoWired @Service
     1.2.3 自定义注解
  1.3 元注解:注解的注解


2.解析注解
   2.1 概念:通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
    * 元注解描述:
    * 1.@interface  自定义注解的关键字
    * 2.@Target 作用域 如方法上,类上,变量上,等
    * 3.@Retention 生命周期:.源代码,编译时,运行时
    * 4.@Inherited 子类是否也有效
    * 5.@Documented javaDoc上

 

3.代码示例

import java.lang.annotation.*;

/**
 * 自定义注解
 *
 * 元注解描述:
 * 1.@interface  自定义注解的关键字
 * 2.@Target 作用域 如方法上,类上,变量上,等
 * 3.@Retention 生命周期:.源代码,编译时,运行时
 * 4.@Inherited 子类是否也有效
 * 5.@Documented javaDoc上
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
    // 1.无参数无异常
    // 2.可以没有成员变量
    // 3.如果只有一个成员时,默认用value()
    // 4.成员类型是受限的,包括原始类型及String,Class,Annotation,Enumeration

    String value();

   // String name();

  //  int age() default 18;
}

 

4.注解的使用

 通常是通过反射来解析注解,以达到相应要求.

 Class c = Class.forName(classname); // 1.通过类的加载器加载类

 // 判断注解指定的注解是否存在
 boolean isExists = c.isAnnotationPresent(Table.class);

 c.getAnnotation(Table.class);

 Method[] mes = c.getDeclaredMethods();

 Field[] fields = c.getDeclaredFields();