JAVA注解Annotation

注解

概念

  • 注解Annotation是JAVA提供的一种对元程序中的元素关联信息和元数据(metadata)的途径和方法
  • 注解Annotation是一个接口,程序可以通过反射来获取指定程序中元素的Annotation对象,然后通过该Annotation对象获取注解中的元数据信息。

标准元注解

  • 元注解:负责注解其他注解。
  • Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明。
  • @Target修饰对象范围
    • 范围
作用作用域声明
FIELD字段声明
CONSTRUCTOR构造方法声明
LOCAL VARIABLE局部变量声明
METHOD方法声明
PACKAGE包声明
PARAMETER参数声明
TYPE类接口
  • @Retention定义生命周期
    • 生命周期
生命周期周期说明
SOURCE只在源码显示,编译时丢弃
CLASS编译时记录到class中,运行时忽略
RUNTIME运行时存在,可以通过反射读取
  • @Documented描述-javadoc
    • @Documented用于描述其他类型的annotation应该被作为被标注的程序成员的公共API。
  • @Inherited阐述某个被标注的类是被继承的
    • @Inherited元注解是一个标记注解。
    • 如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

注解的属性(成员变量)

  • 注解只有成员变量,没有方法。
  • 注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
    示例:
/**
 * 定义注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
    /**供应商编号 */
    public int id() default -1;

    public String name() default "";

    public String address() default "";
}
  • 注解赋值
public class Apple {
    @FruitProvider(id = 1, name = "陕西红富士集团", address = "陕西省西安市延安路")
    private String appleProvider;

    public String getAppleProvider() {
        return appleProvider;
    }

    public void setAppleProvider(String appleProvider) {
        this.appleProvider = appleProvider;
    }
}
  • 使用@interface自定义注解时,自动继承java.lang.annotation.Annotation接口,由编译程序字段完成其他细节。在定义注解时,不能继承其他注解或接口。
  • @interface用来声明一个注解,其中的每一个方法都声明了一个属性,返回值类型是参数的类型。
  • Annotation类型参数设定:
    • 只能用public或默认(default)修饰
    • 参数成员只能用基本类型、String、Enum、Class、annotaions等数据类型以及这些类型的数组
    • 如果只有一个参数成员,最好把参数名称设置为“value”后加小括号。

JAVA预置注解

  • @Deprecated:标记过时的元素(方法、类或成员变量)
  • @Override:子类要复写父类中修饰的方法
  • @SuppressWarnings:阻止警告
  • @SafeVarargs:参数安全类型注解
  • @FunctionalInterface:函数式接口注解。线程开发中常用的Runnable 就是一个典型的函数式接口,源码可以看到它就被 @FunctionalInterface 注解。

注解处理器

  • Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器
    FruitProvider 、Apple 类在上文中
    public class FruitInfoUtil {
        public static void getFruitInfo(Class <?> clazz){
            String strFruitProvider = "供应商信息:";
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields){
                if (field.isAnnotationPresent(FruitProvider.class)){
                    FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class);
                    strFruitProvider = "供应商编号:" + fruitProvider.id() +" 供应商名称:" +
                            fruitProvider.name() +  " 供应商地址:" + fruitProvider.address();
                    System.out.println(strFruitProvider);
                }
            }
        }
    }
    
    public class FruitRun {
        public static void main(String[] args){
            FruitInfoUtil.getFruitInfo(Apple.class);
        }
    }
    
    运行结果:
    供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延安路
    

注解与反射

  • 注解通过反射获取
    • Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解
    public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
    
    • 通过 getAnnotation() 方法或getAnnotations() 方法来获取 Annotation 对象。
    public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
    public Annotation[] getAnnotations() {}
    
    • 如果获取到的 Annotation 如果不为 null,则就可以调用它们的属性方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值