java注解实现原理的理解
Java 注解实际上只是对包、类、方法、成员变量等 java 程序进行标注。其本身没有业务逻辑、
要实现注解相应的业务逻辑功能必须由另外的处理类来实现。
其基本原理就是通过 java 反射机制,获取这些 java 程序的包、类、方法、成员变量的注解、然后加
以判断并实现相应的业务功能逻辑。
java 的内置注解包括 @Override、@Deprecated、@SuppressWarnings("unchecked") 等,具体的实现逻辑是由编译器实现。
自定义注解只能通过 @Interface 关键字来定义、会自动继承 java.lang.annotation 接口。
在自定义注解时使用元注解来表明注解的作用域以及扩展其他功能,java 中一共有四个元注解。
@Retention::定义了被注解的注解的生命周期,从 RetentionPolicy 中取值。
SOURCE: 在源文件中有效(即源文件保留
CLASS: 在 class 文件中有效(即 class 文件中保留)
RUNTIME: 在运行时有效(即运行时保留)
@Target:用于描述注解所能修饰的对象范围,从 ElementType 中取值。
1.CONSTRUCTOR: 用于描述构造器
2.FIELD: 用于描述域
3.LOCAL_VARIABLE: 用于描述局部变量
4.METHOD: 用于描述方法
5.PACKAGE: 用于描述包
6.PARAMETER: 用于描述参数
7.TYPE: 用于描述类、接口 (包括注解类型) 或 enum 声明
@Documented: 可以让被该注解标示的注解被如 javadoc 此类的工具文档化
生成 javadoc 的步骤:选中类所在的包—>project ->Generate Javadoc
在生成的 index.html 中,注解信息会被文档化
JUnit3:反射实现
JUnit4:注解 + 反射实现
================= 测试 ======================
------------------------------------------------
自定义注解
package test;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
String testAnnView() default "myview";
String value() default "default";
}
------------------------------------------------
使用注解
class FieldAnn {
@MyAnnotation()
private String fieldA;
@MyAnnotation(testAnnView = "testAnnView")
private String fieldB;
}
------------------------------------------------
实现注解逻辑
public class Test1 {
public static void main(String[] args) {
Class clazz = FieldAnn.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
MyAnnotation myAnnotation = field.getAnnotation(MyAnnotation.class);
if (myAnnotation != null) {
System.out.println(field + ":" + field.getName() + "value:" + myAnnotation.testAnnView());
}
}
}
}
结果输出: