Java基础--带你理解什么是注解

注解与注释的区别:

  • 简单来说,注释是给人看的不会被编译器执行,注解是用来修饰代码的,会被编译器执行。

*四大元注解:

    元注解其实就是用来修饰注解的。
  • @Retention: 定义注解的生命周期,注解将会在什么时候从源码中消失。
    • RetentionPolicy.SOURCE:注解仅存在于源码中,编译时就会消失
    • RetentionPolicy.CLASS: 默认的保留策略,注解会在class字节码文件中存在,但运行时会消失。
    • RetentionPolicy.RUNTIME: 注解会在class字节码文件中存在,在运行时可以通过反射获取到
  • @ Target:定义注解的修饰目标,就是说当前注解可以用来修饰哪些对象。
    • TYPE  :接口、类、枚举、注解
    • FIELD:字段、枚举的常量
    • METHOD :方法
    • PARAMETER:方法参数
    • CONSTRUCTOR:构造函数
    • LOCAL_VARIABLE:局部变量
    • ANNOTATION_TYPE:注解
    • PACKAGE:包 
  • @Document:说明该注解将被包含在javadoc中
  • @Inherited:说明子类可以继承父类中的该注解

实现自定义注解:

1、首先实现一个注解类

注解有一个name属性,target注解指明当前注解只能修饰属性

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


@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD })
public @interface MyAnnotation {
	
	 public String name();

}

2、使用这个注解

import java.lang.reflect.Field;

public class AnnoTest {

    @MyAnnotation(name = "wang")
    static String name;
    int i;

    /**
     * 利用反射技术,拿到注解的内容
     */
    public static void main(String[] args) throws ClassNotFoundException {
        // 根据全路径名拿到类实例
        Class cls = Class.forName("MyAnnotation.AnnoTest");
        // 拿到所有实例的属性
        Field[] fs = cls.getDeclaredFields();
        // 遍历所有属性
        for (Field f : fs) {
            // 如果当前属性含有MyAnnotation注解
            if (f.isAnnotationPresent(MyAnnotation.class)) {
                // 拿到注解对象
                MyAnnotation a = f.getAnnotation(MyAnnotation.class);
                // 拿到注解的属性
                name = a.name();
            }
        }

        System.out.println(name);

    }

}

 

总结:先自定义注解类,在类中声明需要的属性。然后在需要的地方使用注解。然后利用反射技术拿到注解的内容。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章