现在的位置: 首页 > 移动开发 > 正文

android反射组件 (一)java 自定义annotation基础知识

2019年10月08日 移动开发 ⁄ 共 2183字 ⁄ 字号 评论关闭

自定义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  注解是否可以被子类继承

   实例代码:

@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的类

   实例代码:

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处理方法

   实例代码:

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方法

public class Main {
    
    public static void main(String[] args) {
        Apple apple = new Apple();
        
        FruitInfoUtil.getFruitInfo(apple);
        
        apple.displayName();
    
    }
}


运行结果:

水果的名字是: Apple 水果的颜色是:RED


上传下别人总结的annotation的一张图,非常直观



     

抱歉!评论已关闭.