Java注解学习笔记

2018-08-05  本文已影响8人  捉虫大师

什么是Java注解

  1. @Target说明注解修饰对象的范围。
ElementType.CONSTRUCTOR 描述构造器
ElementType.FIELD 描述域
ElementType.LOCAL_VARIABLE 描述局部变量
ElementType.METHOD 描述方法
ElementType.PACKAGE 描述包
ElementType.PARAMETER 描述参数
ElementType.TYPE 描述类、接口(包括注解类型)或enum声明
  1. @Retention定义注解被保留时间的长短。
RetentionPoicy.SOURCE 源文件保留
RetentionPoicy.CLASS class文件保留
RetentionPoicy.RUNTIME 运行时保留
  1. @Documented 这个注解修饰的Annotation类可以被javadoc工具提取成文档,他是一个标记注解,没有成员。
  2. @Inherited表示被标注过的类型是被继承的,如果一个@Inherited修饰的注解类型被用于一个class,则这个注解将被用于该class的子类,他也是个标记注解。

如何自定义一个注解

public @interface 注解名 {定义体}
package annotationtest;

import java.lang.annotation.*;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {

    public enum Color {BLUE, RED, GREEN};

    Color fruitColor() default Color.RED;
}
package annotationtest;

public class Apple {

    @FruitColor(fruitColor = FruitColor.Color.RED)
    public String color;
}
package annotationtest;

import java.lang.reflect.Field;

public class FruitInfoUtil {

    public static String getFruitInfo(Class<?> tClass) {

        String colorString = "";

        Field[] fields = tClass.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(FruitColor.class)) {
                FruitColor fruitColor = field.getAnnotation(FruitColor.class);
                colorString = fruitColor.fruitColor().toString();
            }
        }
        return colorString;
    }

}
package annotationtest;

public class FruitMain {

    public static void main(String[] args) {
        System.out.println("apple color:"+FruitInfoUtil.getFruitInfo(Apple.class));
    }
}

原理

从上面的例子能看出,注解起作用是java的反射机制。

// 获取类的属性
Field[] fields = tClass.getDeclaredFields();
// 获取类的构造方法
Constructor[] constructors = tClass.getConstructors();
// 获取类方法
Method[] methods = tClass.getMethods();
上一篇 下一篇

猜你喜欢

热点阅读