Java 注解 应用

Java 注解是什么,在这里只写 我自己的理解

注解是像钩子一样,写在代码中,可用反射处理我们写的代码里的注解 信息。比如可以字段验证,结合 AOP 处理统一处理权限等操作。Spring MVC 中就用到了很多注解。

元注解: 指定义注解的注解。

包括 @Retention @Target @Document @Inherited 四种。

1.@Retention: 定义注解的保留策略
@Retention(RetentionPolicy.SOURCE)   // 注解仅存在于源码中,在 class 字节码文件中不包含; 检查性的操作,比如 @Override 和 @SuppressWarnings
@Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在 class 字节码文件中存在,但运行时无法获得,编译时进行一些预处理操作,比如生成辅助代码
@Retention(RetentionPolicy.RUNTIME)  // 注解会在 class 字节码文件中存在,在运行时可以通过反射获取到 运行时去动态获取注解信息;
生命周期长度 SOURCE < CLASS < RUNTIME 。

2.@Target:定义注解的作用目标
@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) /// 包    

3.@Document:说明该注解将被包含在 javadoc 中
4.@Inherited:说明子类可以继承父类中的该注解

注解定义

package main.java.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**

  • @author jiangqiang
  • @version 2.0.1
  • @date 2018/4/26
    /
    @Target(ElementType.TYPE)
    //Class, interface (including annotation type), or enum declaration
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ClassAnnotation {
    String author()
    default "jiangqiang";
    String version()
    default "1.0";
    String description()
    default "";
    }
package main.java.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**

  • @author jiangqiang
  • @version 2.0.1
  • @date 2018/4/25
    /
    @Target(ElementType.FIELD)
    //Field declaration (includes enum constants)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface FieldAnnotation {
    int length() default 0;
    String description()
    default "";
    }
package main.java.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**

  • @author jiangqiang
  • @version 2.0.1
  • @date 2018/4/26
    /
    @Target(ElementType.METHOD)
    //Method declaration
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MethodAnnotation {
    String author()
    default "jianqiang";
    String version()
    default "1.0";
    String description()
    default "";
    }

注解使用

 

package main.java.example;

import main.java.annotation.ClassAnnotation;
import main.java.annotation.MethodAnnotation;

/**

  • @author jiangqiang

  • @version 2.0.1

  • @date 2018/4/26
    /
    @ClassAnnotation(author
    = "demo",version = "10.2",description = "测试注解类")
    public class AnnotationExample {

    @MethodAnnotation(author = "jiangqiang",version = "1.3",description = "测试注解方法")
    public void AnnotationMethod(Entity entity,String content){
    System.out.println(
    "name:"+entity.getName()+";description:"+entity.getDescription());
    System.out.println(
    "content:"+content);
    }
    }

 

package main.java.example;

import main.java.annotation.FieldAnnotation;

/**

  • @author jiangqiang

  • @version 2.0.1

  • @date 2018/4/25
    /
    public class Entity {
    @FieldAnnotation(length
    = 2,description = "名称")
    private String name;
    @FieldAnnotation(length
    = 5,description = "描述")
    private String description;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getDescription() {
    return description;
    }

    public void setDescription(String description) {
    this.description = description;
    }
    }

注解应用

import main.java.annotation.FieldAnnotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**

  • Hello world!

*/
public class App
{
public static void main(String[] args ) throws Exception
{
//类注解
Class<AnnotationExample> annotationExampleClass = AnnotationExample.class;
ClassAnnotation classAnnotation
= annotationExampleClass.getAnnotation(ClassAnnotation.class);
System.out.println(classAnnotation.author());
System.out.println(classAnnotation.version());
System.out.println(classAnnotation.description());

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">方法注解</span>
    Method method = annotationExampleClass.getMethod("AnnotationMethod",<span style="color: rgba(0, 0, 255, 1)">new</span> Class[]{Entity.<span style="color: rgba(0, 0, 255, 1)">class</span>,String.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">});
    MethodAnnotation methodAnnotation </span>= method.getAnnotation(MethodAnnotation.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
    System.out.println(methodAnnotation.author());
    System.out.println(methodAnnotation.version());
    System.out.println(methodAnnotation.description());

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字段注解</span>
    Class&lt;Entity&gt; entityClass= Entity.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;
    Field[] fields </span>=<span style="color: rgba(0, 0, 0, 1)"> entityClass.getDeclaredFields();
    </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(Field field:fields){
       FieldAnnotation fieldAnnotation </span>= field.getAnnotation(FieldAnnotation.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
        System.out.println(fieldAnnotation.length());
        System.out.println(fieldAnnotation.description());
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据字段名获取</span>
    Field field = entityClass.getDeclaredField("name"<span style="color: rgba(0, 0, 0, 1)">);
    FieldAnnotation entityField </span>=  field.getAnnotation(FieldAnnotation.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
    System.out.println(entityField.length());
    System.out.println(entityField.description());
}

}