出自:Java3y https://mp.weixin.qq.com/s/n-P8W8OzcKIg3UiFC-JycA
前言
今天要讲的是注解,对于本章节,最好是有Servlet基础的人查阅~因为单纯是Java基础的话,可能用不上注解这个东西。但如果开发过Servlet,就对@WebServlet不会陌生。
现在的开发都推崇使用注解来进行开发,这样就可以免去写XML配置了,十分方便的一项技术~
学习注解可以更好地理解注解是怎么工作的,看见注解了就可以想到它的运行原理了~。
如果有错的地方请大家多多包涵并欢迎在评论区指正~
一、什么是注解?
注解:Annotation….
注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。
二、为什么我们需要用到注解?
传统的方式,我们是通过配置文件(xml文件)来告诉类是如何运行的。
有了注解技术以后,我们就可以通过注解告诉类如何运行
例如:我们以前编写Servlet的时候,需要在web.xml文件配置具体的信息
![4329898f91b25118a2d096273b9729ec.png](https://i-blog.csdnimg.cn/blog_migrate/c4ea213123862d855db76d2a4e15dda5.jpeg)
这里写图片描述
我们使用了注解以后,可以直接在Servlet源代码上,增加注解…Servlet就被配置到Tomcat上了。也就是说,注解可以给类、方法上注入信息。
![eab755f896bba66f4d2a894943932da8.png](https://i-blog.csdnimg.cn/blog_migrate/25e5f1c4c58b3fa2c2fb2d949b7152e0.jpeg)
这里写图片描述
明显地可以看出,这样是非常直观的,并且Servlet规范是推崇这种配置方式的。
三、基本Annotation
在java.lang包下存在着5个基本的Annotation,其中有3个Annotation我们是非常常见的了。
3.1@Override
重写注解
如果我们使用IDE重写父类的方法,我们就可以看见它了。那它有什么用呢??
@Overried是告诉编译器要检查该方法是实现父类的…可以帮我们避免一些低级的错误…
比如,我们在实现equals()方法的时候,把euqals()打错了,那么编译器就会发现该方法并不是实现父类的,与注解@Override冲突,于是就会给予错误。
![e4e04391e378c559b955c4274199866f.png](https://i-blog.csdnimg.cn/blog_migrate/34a05c107cfc4652ecb95b55d375967b.jpeg)
这里写图片描述
3.2@Deprecated
过时注解
该注解也非常常见,Java在设计的时候,可能觉得某些方法设计得不好,为了兼容以前的程序,是不能直接把它抛弃的,于是就设置它为过时。
Date对象中的toLocalString()就被设置成过时了
@Deprecated public String toLocaleString() { DateFormat formatter = DateFormat.getDateTimeInstance(); return formatter.format(this); }
当我们在程序中调用它的时候,在IDE上会出现一条横杠,说明该方法是过时的。
![4329898f91b25118a2d096273b9729ec.png](https://i-blog.csdnimg.cn/blog_migrate/c4ea213123862d855db76d2a4e15dda5.jpeg)
这里写图片描述
3.3@SuppressWarnings
抑制编译器警告注解
该注解在我们写程序的时候并不是很常见,我们可以用它来让编译器不给予我们警告
当我们在使用集合的时候,如果没有指定泛型,那么会提示安全检查的警告
![cd3ee7e6783982cd6c648680f6a0719f.png](https://i-blog.csdnimg.cn/blog_migrate/2e26d291aa7b019eee75a09447c50dff.jpeg)
这里写图片描述
如果我们在类上添加了@SuppressWarnings这个注解,那么编译器就不会给予我们警告了
![56af24ac6a8a69543bf1dc257f3545bf.png](https://i-blog.csdnimg.cn/blog_migrate/677714f3f5d81efd7bee992b007b20d7.jpeg)
这里写图片描述
3.4@SafeVarargs
Java 7“堆污染”警告
什么是堆污染呢??当把一个不是泛型的集合赋值给一个带泛型的集合的时候,这种情况就很容易发生堆污染….
这个注解也是用来抑制编译器警告的注解…用的地方并不多,我也不详细说明了……有用到的时候再回来填坑吧。
3.5@FunctionalInterface
@FunctionalInterface用来指定该接口是函数式接口
用该注解显示指定该接口是一个函数式接口。
四、自定义注解基础
上面讲解的是java.lang包下的5个注解,我们是可以自己来写注解,给方法或类注入信息。
4.1标记Annotation
没有任何成员变量的注解称作为标记注解,@Overried就是一个标记注解
//有点像定义一个接口一样,只不过它多了一个@public @interface MyAnnotation {}
4.2元数据Annotation
我们自定义的注解是可以带成员变量的,定义带成员变量的注解叫做元数据Annotation
在注解中定义成员变量,语法类似于声明方法一样….
public @interface MyAnnotation { //定义了两个成员变量 String username(); int age();}
注意:在注解上定义的成员变量只能是String、数组、Class、枚举类、注解
有的人可能会奇怪,为什么注解上还要定义注解成员变量??听起来就很复杂了….
上边已经说了,注解的作用就是给类、方法注入信息。那么我们经常使用XML文件,告诉程序怎么运行。XML经常会有嵌套的情况
zhongfucheng作者> 22222价钱>书>
那么,当我们在使用注解的时候,也可能需要有嵌套的时候,所以就允许了注解上可以定义成员变量为注解。
4.3使用自定义注解
上面我们已经定义了一个注解了,下面我们来使用它吧
4.3.1常规使用
下面我有一个add的方法,需要username和age参数,我们通过注解来让该方法拥有这两个变量!
//注解拥有什么属性,在修饰的时候就要给出相对应的值 @MyAnnotation(username = "zhongfucheng