• java注解


    自JDK1.5之后引入注解之后,各个框架中都提供了支持注解的方式。在日常开发中慢慢的将XML许多的配置转换成注解,经常的使用,各类开源框架中各种注解。在项目中自定义一些注解来方便开发等等。可见注解的易用性和广泛性。 

    这边对注解做一些了解:

    元注解:在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 {
                // 后去对应的类
                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();
            }
        }
    
    }
  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/yanbincn/p/2529306.html
Copyright © 2020-2023  润新知