概述
注解(Annotation)就是 class
中的一小段信息 | 文本 | 标记
注解可以携带参数
注解可以在运行时被阅读
java.lang.annotation
元注解
元注解 => 可以放在注解上面的注解
@Target
注解可以标注在什么东西上
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) // 只能标注在方法上
public @interface SpringBootApplication {
}
@Retention
这个注解在编译后会不会被保留 => 保留等级 => 保留政策 => java.lang.annotation.RetentionPolicy
java.lang.annotation.RetentionPolicy
-
SOURCE
=> 注解会被编译器丢弃 => 反射拿不到 -
CLASS
=> default => 注解会被保留在字节码中 & 运行期不会保留 => 反射拿不到 -
RUNTIME
=> 注解会被保留在字节码中,并且在运行期中也会保留 => 反射可以拿到
@inherited
注解放在 A 类上,A 的子类上也会出现 A 类上的注解
@Repeatable
注解可以重复
注解的属性
注解中可以有值,方便注解的复用
注解的属性类型 => 基本数据类型 + String + 类 以及他们的数组
public @interface TestAnnotation {
String[] value() default "Test"; // 属性 value,默认值 Test
String name(); // 属性 name
}
// 使用
@TestAnnotation(value = {"Test", "Second", "Third"}, name = "name")
JDK 自带注解
-
@Override
=>@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.SOURCE)
=> 不写@Override
也可以正常工作,但是@Override
可以 check 方法是否覆盖 -
@Deprecated
=> 已废弃 =>@Retention(RetentionPolicy.RUNTIME)
-
@SuppressWarnings
=> 抑制警告 -
@FunctionalInterface
=> 函数式接口,标记接口
注解是如何工作的
注解仅仅是一段信息,它自己无法工作,如果没有东西处理注解,注解将没有任何用处
知识点
-
class
是什么?-
class
是 Java 类的说明书 - 可以通过反射 或 JVM 阅读该说明书,创建类的实例
-
- 注解如何放在 package 上 =>
java.lang.annotation.ElementType.PACKAGE
- 在 package 下面创建一个
package-info.java
- 在
package-info.java
中添加注解
- 在 package 下面创建一个
-
package-info.java
作用- 可以写一些包的注释,为整个包提供一个注释
- // TODO
- 在字节码中
@LXXX
中的L
表示虚拟机内部用于表示一个类型的标志 - Byte Buddy => Runtime code generation for the Java virtual machine
- 所有的注解隐式
extends Annotation
,不需要显式书写public @interface Test {} // 等价于 public @interface Test extends Annotation {}
- 反射是一个很慢,效率非常低的操作,如有可能可以将其提至属性,不至于每次调用都进行反射
- 装饰器模型 TODO
- AOP 切点 PointCut 通知 Advice // TODO
网友评论