Java注解基本原理

注解这玩意,我们经常打交道,在平时写代码或阅读代码经常会碰到,比如

@Override,表示当前的方法定义会覆盖基类中的方法,如果基类没这个方法,当前类中会报错,提醒开发者注意方法名是否有误
@Deprecated,标识为过期的被废弃的代码,不建议继续使用的代码,@Deprecated会在它的元素编译器发出警告
@SuppressWarnings,关闭不当编译器警告信息,一般我们自己知道是安全的,就可以用它来关闭警告

除了这三个常用的,还有几个,扶着新注解的创建,按照文档中所示

@Target  表示该注解可以用于什么地方,是构造器还是方法或者是类,参数类型为 ElementType ,可能的ElementType参数有:
CONSTRUCTOR:构造器的声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
使用时一般为  @Target( ElementType.TYPE) 或者 @Target( { ElementType.METHOD, ElementType.TYPE }) ,如果是一个,直接写,如果是多个,则使用一个大括号包裹一下,像数组一样。

@Retention  表示需要在什么级别保存该注解的信息,参数类型为 RetentionPolicy ,可选的RetentionPolicy参数有:
SOURCE:注解将被编译器丢弃,这个可以用来生成class文件
CLASS:注解在class文件中可用,但会被VM丢弃,用来生成class文件
RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息,然后做一些操作
使用时为  @Retention(RetentionPolicy.RUNTIME)    这个是单一使用,只能三选一,不能多选。
SOURCE 和 CLASS 有什么区别呢?因为这两个都能生成class文件,所以一开始是蒙的。后来搜索相关文章,基本可以认为RetentionPolicy.SOURCE仅仅是给应用层开发人员用的,RetentionPolicy.CLASS 需要应用层和底层系统开发人员配合使用的。

@Document  将注解包含在Javadoc中,这个一般是生成api文档时使用

@Inherited  允许子类继承父类中的注解。 这个意思是 类 A 和类 B, A 是 B 的子类,如果A上面有注解,并且使用了本注解,则注解对B也适用。


举个栗子

@Retention(RetentionPolicy.RUNTIME)
@Target( ElementType.TYPE)
public @interface MyAnnotation {

    String numer() default "0";
}

@MyAnnotation(numer = "1")
public class AnimationTest {

    public static void main(String[] args) {

        test1();

    }

    private static void test1() {
        if (AnimationTest.class.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation annotation = AnimationTest.class.getAnnotation(MyAnnotation.class);
            System.out.println(annotation);
            System.out.println(annotation.numer());
        }
    }

}

打印结果为
@com.example.cn.desigin.test.MyAnnotation(numer=1)
1


我们自定义注解时,一般格式是用 public @interface 来修饰,然后起个名字,比如 MyAnnotation,然后使用注解来修饰,@Retention(RetentionPolicy.RUNTIME) 和 @Target( ElementType.TYPE)。RetentionPolicy.RUNTIME 的意思是在运行时生效,ElementType.TYPE 意思是这个注解,修饰类、枚举等 ;String numer() 是我们自定义的方法,用来赋值,default "0" 意思是 默认值为 "0",这个 default "0" 可以不写,这样就没默认值,MyAnnotation 注解使用时,括号里就必须添加上number的值。

我们定义一个 AnimationTest 类,在这个类上面使用了注解,注意格式 @MyAnnotation(numer = "1"),意思是number的值为1。注意方法 test1(),第一行是个判断,我们获取到加注解的类的class文件,调用 isAnnotationPresent() 方法,判断是否包含此注解,如果有,则为true,然后就是 getAnnotation() 方法,获取到此注解,同时也可以获取到注解里面方法中的值,打印 annotation 获取的值为 @com.example.cn.desigin.test.MyAnnotation(numer=1),前面是注解的全名,包括所在包的名,括号里是方法的值。


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值