自定义annotation包括三部分: 自定义annotation、使用annotation的类、annotation的处理方法。
一、自定义annotation
元注解包括以下:
1)@Target 描述注解使用的范围
取值包括:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
2) @Retention 定义了注解被保留的时间段
取值包括:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
3)@Documented 是否可以被工具文档化
4)@Inherited 注解是否可以被子类继承
实例代码:
[java] view
plaincopy
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface FruitName {
- public String value() default "";
- }
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface FruitColor {
- public enum Color {BULE, RED, GREEN}
- public Color fruitColor() default Color.GREEN;
- }
二、使用annotation的类
实例代码:
[java] view
plaincopy
- public class Apple {
- @FruitName("Apple")
- private String appleName;
- @FruitColor(fruitColor=FruitColor.Color.RED)
- private String appleColor;
- public void setAppleColor(String appleColor) {
- this.appleColor = appleColor;
- }
- public String getAppleColor() {
- return appleColor;
- }
- public void setAppleName(String appleName) {
- this.appleName = appleName;
- }
- public String getAppleName() {
- return appleName;
- }
- public void displayName(){
- System.out.println("水果的名字是: "+ appleName + " 水果的颜色是:"+ appleColor);
- }
- }
三、annotation处理方法
实例代码:
[java] view
plaincopy
- public class FruitInfoUtil {
- public static void getFruitInfo(Object obj){
- Class<?> clazz = obj.getClass();
- Field[] fields = clazz.getDeclaredFields();
- for(Field field : fields){
- if(field.isAnnotationPresent(FruitName.class)){
- FruitName fruitName = (FruitName)field.getAnnotation(FruitName.class);
- try {
- field.setAccessible(true);
- field.set(obj, fruitName.value());
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }else if(field.isAnnotationPresent(FruitColor.class)){
- FruitColor fruitColor = (FruitColor)field.getAnnotation(FruitColor.class);
- try {
- field.setAccessible(true);
- field.set(obj, fruitColor.fruitColor().toString());
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
LAST: main方法
[java] view
plaincopy
- public class Main {
- public static void main(String[] args) {
- Apple apple = new Apple();
- FruitInfoUtil.getFruitInfo(apple);
- apple.displayName();
- }
- }
运行结果:
水果的名字是: Apple 水果的颜色是:RED
上传下别人总结的annotation的一张图,非常直观
时间: 2024-10-04 02:21:39