注解的概念
注解(Annotation)是Java提供的设置程序中元素的关联信息和元数据(MetaData)的方法,它是一个接口,程序可以通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息。
注解(Annotation)是 Java 5 引入的一种特殊语法,它允许我们在代码中添加元数据(Metadata),即注释信息,来描述类、方法、字段等程序成员的特性和功能。注解可以帮助程序员更好地理解和维护代码,并且提供了一种通用的机制来实现某些功能,如生成文档、配置文件、单元测试等。
注解本身没有实际的业务逻辑,只是起到了标记的作用,告诉编译器或运行时环境要执行相应的操作。注解以 “@” 符号开头,放置于类、方法、变量等声明前面。
元注解
元注解(Meta-Annotation)是一种用于标记其他注解的注解。Java 中提供了几种元注解,用于指定注解的行为和作用域。
Java 提供的元注解包括:
@Target
:用于指定注解可以应用的目标(比如类、方法、字段、参数等)。@Target
常用的取值包括:ElementType.TYPE
:用于类、接口、枚举等类型的声明。ElementType.FIELD
:用于字段声明,包括枚举常量。ElementType.METHOD
:用于方法声明。ElementType.PARAMETER
:用于方法参数声明。ElementType.CONSTRUCTOR
:用于构造函数声明。ElementType.LOCAL_VARIABLE
:用于局部变量声明。ElementType.ANNOTATION_TYPE
:用于注解类型声明。ElementType.PACKAGE
:用于包声明。
@Retention
:用于指定注解的生命周期(比如在源码中保留、编译时保留、运行时保留等)。RetentionPolicy.SOURCE
:表示注解只保留在源代码中,编译后不会包含在字节码中,因此不会对运行产生任何影响。RetentionPolicy.CLASS
:表示注解保留在字节码中,在程序编译时加载到 JVM 中,但是在运行时不可见。RetentionPolicy.RUNTIME
:表示注解保留在类文件中并在运行时可见,因此可以通过反射机制读取注解信息。
@Inherited
:用于指定注解是否可以被子类继承。(常用为true)@Inherited
元注解只有一个取值,即布尔类型的value
,默认值为true
。如果将value
设置为false
,则该注解将不会被继承。- 需要注意的是,
@Inherited(false)
注解仅对直接继承的子类起作用,对于间接继承的子类无效。也就是说,如果一个类中定义了一个注解MyAnnotation
并标记了@Inherited(false)
,那么该注解将不会被其直接继承的子类所继承,但是如果该直接继承的子类再定义一个间接继承的子类,则该注解会被间接继承的子类所继承。
@Documented
:用于指定注解是否需要生成文档。
示例代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedCheckPermission {
String value() default "";
}
// 定义一个测试类,在方法上添加 "NeedCheckPermission" 注解
public static class TestClass {
@NeedCheckPermission("admin")
public void testMethod() {
System.out.println("This is a test method.");
}
}
// 在主函数中使用反射来获取注解信息
public static void main(String[] args) throws Exception {
TestClass test = new TestClass();
Method method = test.getClass().getMethod("testMethod");
// 判断方法是否有 "NeedCheckPermission" 注解,并输出注解信息
if (method.isAnnotationPresent(NeedCheckPermission.class)) {
NeedCheckPermission annotation = method.getAnnotation(NeedCheckPermission.class);
System.out.println("该方法需要进行权限检查,权限值为:" + annotation.value());
} else {
System.out.println("该方法不需要进行权限检查。");
}
}