深入学习JAVA注解-Annotation(学习过程) (4)

它有一个 value 属性需要你主动的传值,这个 value 代表一个什么意思呢,这个 value 代表的就是需要被压制的警告类型。例如:

public static void main(String[] args) { Date date = new Date(2019, 12, 27); }

这么一段代码,程序启动时编译器会报一个警告。

Warning:(8, 21) java: java.util.Date 中的 Date(int,int,int) 已过时

而如果我们不希望程序启动时,编译器检查代码中过时的方法,就可以使用 @SuppressWarnings 注解并给它的 value 属性传入一个参数值来压制编译器的检查。

@SuppressWarning(value = "deprecated") public static void main(String[] args) { Date date = new Date(2019, 12, 27); }

这样你就会发现,编译器不再检查 main 方法下是否有过时的方法调用,也就压制了编译器对于这种警告的检查。

当然,JAVA 中还有很多的警告类型,他们都会对应一个字符串,通过设置 value 属性的值即可压制对于这一类警告类型的检查。

自定义注解:

自定义注解的语法比较简单,通过类似以下的语法即可自定义一个注解。

public @interface InnotationName{ }

当然,自定义注解的时候也可以选择性的使用元注解进行修饰,这样你可以更加具体的指定你的注解的生命周期、作用范围等信息。

注解的属性 && 注解的使用

注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation { int id(); String msg(); }

上面代码定义了 TestAnnotation 这个注解中拥有 id 和 msg 两个属性。在使用的时候,我们应该给它们进行赋值。

赋值的方式是在注解的括号内以 value=”” 形式,多个属性之前用 ,隔开。

需要注意的是,在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。

注解中属性可以有默认值,默认值需要用 default 关键值指定。比如:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation { public int id() default -1; public String msg() default "Hi"; }

TestAnnotation 中 id 属性默认值为 -1,msg 属性默认值为 Hi。 它可以这样应用。

@TestAnnotation() public class Test {}

因为有默认值,所以无需要再在 @TestAnnotation 后面的括号里面进行赋值了,这一步可以省略。

最后,还需要注意的一种情况是一个注解没有任何属性。比如

public @interface Perform {}

那么在应用这个注解的时候,括号都可以省略。

到目前为止:我仅仅知道注解是如何定义的,具体用起来是怎么实现的呢?

比如@override是怎么去校验的??毕竟点开源码,看它定义起来挺简单的

@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }

再比如,我的类上面添加一个 @Documented 注解,在生成文档的时候就会自动根据我写的 doc去生成文档吗?他是怎么实现的?通过扫描注解类来完成吗?

再比如,之前用过的@bean 注解,我们在spring框架使用时候,在java类上定义之后,就会在加载的时候扫描加载到容器吗?具体是怎么实现的呢?

我觉得我需要很明白的理解这写问题。自己预估可能跟其他人提到的反射有关

那么。带着这些个疑问,我们继续向下学习。 注解与反射

上述内容我们介绍了注解使用上的细节,也简单提到,「注解的本质就是一个继承了 Annotation 接口的接口」,现在我们就来从虚拟机的层面看看,注解的本质到底是什么。

注解的使用实例

注解运用的地方太多了,如:
JUnit 这个是一个测试框架,典型使用方法如下:

public class ExampleUnitTest { @Test public void addition_isCorrect() throws Exception { assertEquals(4, 2 + 2); } }

还有例如ssm框架,springboot,springcloud等运用了大量的注解。

总结

算是对注解有了基本的认知。谈谈自我总结吧。

如果注解难于理解,你就把它类同于标签,标签为了解释事物,注解为了解释代码。

注解的基本语法,创建如同接口,但是多了个 @ 符号。

注解的元注解。

注解的属性。

注解主要给编译器及工具类型的软件用的。

注解的提取需要借助于 Java 的反射技术,反射比较慢,所以注解使用时也需要谨慎计较时间成本(需研究反射,!important)。

我之前的问题:

我推论,我之前的问题,并不是出现在注解上面了。

我之前的疑问的功能是通过注解,反射来完成的.注解只是起到了注解该完成的功能。

接下来需要研究的是:反射。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspfwg.html