java元注解和自定义注解的区别
Java的自定义注解是一种元数据,可以应用于类、方法、字段等程序元素上,以提供额外的信息或指示。
自定义注解包括注解声明、元注解、运行时处理器三个部分。注解声明指定了注解的名称、作用域、成员等信息;元注解则用来对注解进行修饰;运行时处理器则负责在程序运行过程中处理注解,并根据注解提供的信息执行相应的逻辑。自定义注解在编写框架、插件等开发时非常常见,可以为代码提供更多的灵活性和可扩展性。
自定义注解类可以通过以下步骤使用:
-
定义注解类,指定注解的元素和属性。
-
在需要使用注解的地方,使用@注解名称来标注目标元素,可以是类、方法、字段等程序元素。
-
可以使用反射机制获取注解,并对注解进行处理。
例如,定义一个自定义注解类:
import java.lang.annotation.*;
/**
* @Description
* @Author 刘品水
* @Data 2023/5/5 18:44
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
String value() default "";
int num() default 0;
}
然后在代码中使用该注解:
/**
* @Description
* @Author 刘品水
* @Data 2023/5/5 18:44
*/
@MyAnnotation(value = "Hello 阿水!", num = 1314)
public class MyClass {
@MyAnnotation("阿水")
private String name;
@MyAnnotation(num = 666,value = "闻道有先后,术业有专攻~")
public void myMethod() {
// Do something you want to do!
}
@MyAnnotation(value = " ")
public void myMethod2() {
// Do something you want to do!
}
}
可以通过反射获取注解并处理:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Description
* @Author 刘品水
* @Data 2023/5/5 18:46
*/
public class MyTest {
public static void main(String[] args) throws Exception {
// 获取类上的注解
MyAnnotation classAnnotation = MyClass.class.getAnnotation(MyAnnotation.class);
System.out.println("获取类上的注解value值:"+classAnnotation.value()); // 输出:Hello 阿水!
System.out.println("获取类上的注解num值:"+classAnnotation.num()); // 输出:1314
// 获取字段上的注解
Field field = MyClass.class.getDeclaredField("name");
MyAnnotation fieldAnnotation = field.getAnnotation(MyAnnotation.class);
System.out.println("获取类上的注解value值:"+fieldAnnotation.value()); // 输出:阿水
System.out.println("获取类上的注解num值:"+fieldAnnotation.num()); // 输出:0
// 获取方法上的注解
Method method = MyClass.class.getDeclaredMethod("myMethod");
MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
System.out.println("获取myMethod方法上的注解value值:"+methodAnnotation.value()); // 输出:闻道有先后,术业有专攻~
System.out.println("获取myMethod方法上的注解num值:"+methodAnnotation.num()); // 输出:666
// 获取方法上的注解
Method method2 = MyClass.class.getDeclaredMethod("myMethod2");
MyAnnotation methodAnnotation2 = method2.getAnnotation(MyAnnotation.class);
System.out.println("获取myMethod2方法上的注解value值:"+methodAnnotation2.value()); // 输出:
System.out.println("获取myMethod2方法上的注解num值:"+methodAnnotation2.num()); // 输出:0
}
}
注意:自定义注解类必须要有@Retention和@Target元注解,@Retention指定注解的保留策略,@Target指定注解可以应用到哪些元素上。在这里,我们使用RUNTIME保留策略表示注解在运行时仍然有效,并且使用TYPE和METHOD作为注解的目标元素。
Java自定义注解类使用注意事项
在使用Java自定义注解类时,需要注意以下几点:
-
注解元素类型:自定义注解中的元素类型必须是基本数据类型、String、Class、枚举类型或者其他注解类型。
-
注解属性默认值和赋值:自定义注解中的属性可以设置默认值,但在使用注解时可以不指定该属性的值。如果需要给属性赋值,则必须按照属性名=属性值的格式进行赋值。
-
自定义注解可以使用反射机制来获取和处理,因此要保证注解中的元素符合Java语言规范,不会导致编译错误。
-
可以使用元注解@Retention和@Target来指定注解的保留策略和目标范围。一般情况下,@Retention应该设置为RUNTIME,@Target应该根据需要选择适当的目标类型。
-
在使用注解时,应该遵循注解的语法规则,即使用 "@" 符号后跟着注解名称,并在括号中指定注解属性和值。如果需要使用多个注解,则可以将它们放在同一个目标元素上,或者使用Java 1.8新增的@Repeatable注解。