灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3572回复:0

java注解

楼主#
更多 发布于:2012-09-08 09:45

自JDK1.5之后引入注解之后,各个框架中都提供了支持注解的方式。在日常开发中慢慢的将XML许多的配置转换成注解,经常的使用 甚至陶sir在定义日终类的时候,自定义了注解:@Trigger 和 @TargetMethod 以作使用。可见注解的易用性和广泛性。
这边对注解做一些了解
元注解:在jdk中提供了 为自定义注解 所需要的几个元注解:
    @interface : 用于定义注解
    @Target :用于描述注解的使用范围  大致有 method(方法) field(属性) type (类)
    @Retention : 注解的生命周期 SOURCE :源文件有效,CLASS :class文件有效, RUNTIME : 运行时有效
    @Documented : javadoc记录标记
然后对应注解 自定义 method field type 三类注解:

/**
* 自定义注解,目标范围是字段
*
* @author yanbin
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AnnotationField {
    public String fieldValue() default "default Field value";
}
/**
* 自定义注解,目标范围是方法
*
* @author yanbin
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AnnotationMethod {
    public String methodValue() default "default Method value";
  
}
/**
* 自定义注解,目标是类
*
* @author yanbin
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AnnotationType {
    public String typeValue() default "default Type value";
}


在一个类上面使用自定义的注解:

/**
* 注解使用者
*
* @author yanbin
*
*/
@AnnotationType(typeValue = "user Type value")
public class AnnotationUser {
    /** 字段属性 */
    @AnnotationField(fieldValue = "user Field value")
    private String userField;
    /**
     * 使用者方法
     */
    @AnnotationMethod(methodValue = "user method value")
    public String userMethod() {
        return "user default method value";
    }
    /**
     * 做事
     */
    public void doIt() {
        System.out.println(userField);
    }
    public String getUserField() {
        return userField;
    }
    public void setUserField(String userField) {
        this.userField = userField;
    }
}


测试类,解析注解:

/**
* 注解测试类,获取注解关键在反射
*
* @author yanbin
*
*/
public class AnnotationTest {
    public static void main(String[] args) {
        AnnotationTest test = new AnnotationTest();
        test.resolve();
        test.testDoIt();
    }
    /**
     * 解析如何获取注解对应注解中的值
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void resolve() {
        try {
            // 后去对应的类 www.atcpu.com
            Class clazz = Class.forName("annotation.user.AnnotationUser");
            // 判断clazz是否存在FirstAnno.class注解
            if (clazz.isAnnotationPresent(AnnotationType.class)) {
                // 存在,则获取这个注解
                AnnotationType annoType = (AnnotationType) clazz.getAnnotation(AnnotationType.class);
                System.out.println("AnnotationType value: " + annoType.typeValue());
            }
            // 获取该类的所有方法
            Method[] methods = clazz.getDeclaredMethods();
            // 解析方法注解
            for (Method method : methods) {
                if (method.isAnnotationPresent(AnnotationMethod.class)) {
                    AnnotationMethod annoMethod = method.getAnnotation(AnnotationMethod.class);
                    System.out.println("AnnotationMethod value: " + annoMethod.methodValue());
                }
            }
            // 获取该类的所有属性字段
            Field[] fields = clazz.getDeclaredFields();
            // 解析字段注解
            for (Field field : fields) {
                if (field.isAnnotationPresent(AnnotationField.class)) {
                    AnnotationField annoField = field.getAnnotation(AnnotationField.class);
                    System.out.println("AnnotationField value: " + annoField.fieldValue());
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 解释注解中的值,并且赋值给相关属性或者方法
     */
    public void testDoIt() {
        try {
            AnnotationUser user = new AnnotationUser();
            Field field = user.getClass().getDeclaredField("userField");
            if (field.isAnnotationPresent(AnnotationField.class)) {
                AnnotationField annoField = field.getAnnotation(AnnotationField.class);
                // getDeclaredMethod()返回一个 Method 对象,该对象反映此 Class
                // 对象所表示的类或接口的指定已声明方法。name 参数是一个
                // String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组
                // Method doIt = user.getClass().getDeclaredMethod("doIt");
                // 属性必须要由set 或者get 方法,才能调用invoke方法
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), AnnotationUser.class);
                Method doIt = pd.getWriteMethod();
                if (null != doIt) {
                    String value = annoField.fieldValue();
                    doIt.invoke(user, value);
                }
            }
            user.doIt();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



摘自 yanbin_new


喜欢0 评分0
游客

返回顶部