大话空话不用说太多,简而言之,在编译器生成类文件时,标注 可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。当然它也支持自定义 Java 标注。反射+注解,是不是感觉Java变成一种动态语言?哈哈哈!
我觉得注解可以分为三个部分来讲:内置注解,元注解,自定义注解。
一、内置注解
1、@Override 重写
概念:检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
//这个extends 不要在意,我写上去只是为了更加方便直观的去理解,Object是万物之源,不写也会默认是其子类,不用解释过多吧?
public class Annotation1 extends Object{
@Override
public String toString (){
return “我是重新定义过的toString方法”;
}
}
@Override(重写),这个大家应该很熟悉,重写父类的方法。我们可以看下Object类中toString()是什么样子的。
那么显而易见,使用了@Override(重写)注解,方法名、方法参数必须得和父类保持一致,否则会报错。如下图所示:
如果不加@Override(重写)注解,则正常编译。
2、@Deprecated 过期警告
概念:标记过时方法。如果使用该方法,会报编译警告。在开发中,我们经常能遇到这样的情况,如下图:
在jdk中有大量这样的方法,我就不举例了,自己写一个可能会更加方便理解。
public class Annotation1 extends Object{
public static void main(String[] args) {
testDeprecated.toString1();
}
}
class testDeprecated {
@Deprecated
public static String toString1(){
return “我是重新定义过的toString方法”;
}
}
注意点:这个不是报错,只是警告,提醒我们这个方法可能会有问题,可能有更好的方法来实现!
3、@SuppressWarnings 忽略警告
概念:指示编译器去忽略注解中声明的警告。
平时开发中,我们会遇到这样的情况,如下图:
这也不是错误,这是提醒我们,该方法没有使用到,警告提醒的作用。加上@SuppressWarnings注解后。
public class Annotation1 extends Object{
public static void main(String[] args) {
}
@SuppressWarnings(“all”)
public static void testSuppressWarnings(){
System.out.println(“测试+testSuppressWarnings忽略警告!”);
}
}
方法成功高亮起来,并且没有警告提示了!
我们可以点进去看下这个注解为什么需要参数?
看这里,这个不是方法哦,这是参数。
在注解中的参数格式:calss + 参数名 + ()!这个需要强行记忆哦,回头我们自定义注解时也需要用到。换一种写法加深理解!如下图:
注意点:当注解中只有一个参数时,我们无需加上参数名,注解会自动帮我们匹配的。
二、元注解
概念:顾名思义,元注解就是给注解使用的注解!
1、@Retention 作用域-(常用)
概念:表示在什么级别保存该注解信息。在实际开发中,我们一般都写RUNTIME,除非项目有特殊需求!我们看下@Retention的源码。
可以看到,需要一个参数,进参数瞅瞅。
-
SOURCE:源代码时有用。
-
CLASS:class文件中有用,但会被jvm丢弃。
-
RUNTIME:运行时有用。
-
关系:RUNTIME>CLASS>SOURCE
后面我们自定义注解时,每个都需要用该注解!
2、@Documented 作用文档
概念:将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。
老规矩看下源码:
无参的注解,作用域为RetentionPolicy.RUNTIME,运行时有用!这个只是用来作为标记,了解即可,在实际运行后会将该注解写入javadoc中,方便查看。
3、@Target 目标-(常用)
概念:标记这个注解应该是使用在哪种 Java 成员上面!
参数源码:
注意这里是数组格式的参数,证明可以传多个值。
-
@Target(ElementType.TYPE)——接口、类、枚举、注解
-
@Target(ElementType.FIELD)——字段、枚举的常量
-
@Target(ElementType.METHOD)——方法
-
@Target(ElementType.PARAMETER)——方法参数
-
@Target(ElementType.CONSTRUCTOR) ——构造函数
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
rget(ElementType.TYPE)——接口、类、枚举、注解
-
@Target(ElementType.FIELD)——字段、枚举的常量
-
@Target(ElementType.METHOD)——方法
-
@Target(ElementType.PARAMETER)——方法参数
-
@Target(ElementType.CONSTRUCTOR) ——构造函数
最后
终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化
[外链图片转存中…(img-falYdUDs-1721194586022)]