zoukankan      html  css  js  c++  java
  • 【java自定义注解1】java自定义注解-属性

            关于自定义注解,以前项目种应用的不多,最近看新项目过程中发现了挺多自定义注解相关内容,使用起来比较巧妙,于是

    总结了两种方式,记录如下:

            第一种:结合反射进行属性注入,代码如下:

    1、定义一个注解:

    package com.xxx.ann.simple;
    
    
    import java.lang.annotation.*;
    /**
     * 1.注解的定义:Java文件叫做Annotation,用@interface表示。
     *
     * 2.元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。
     *
     * 3.注解的保留策略:
     *
     *   @Retention(RetentionPolicy.SOURCE)     // 注解仅存在于源码中,在class字节码文件中不包含
     *
     *   @Retention(RetentionPolicy.CLASS)      // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
     *
     *   @Retention(RetentionPolicy.RUNTIME)    // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
     *
     * 4.注解的作用目标:
     *
     *   @Target(ElementType.TYPE)                      // 接口、类、枚举、注解
     *
     *   @Target(ElementType.FIELD)                     // 字段、枚举的常量
     *
     *   @Target(ElementType.METHOD)                    // 方法
     *
     *   @Target(ElementType.PARAMETER)                 // 方法参数
     *
     *   @Target(ElementType.CONSTRUCTOR)               // 构造函数
     *
     *   @Target(ElementType.LOCAL_VARIABLE)            // 局部变量
     *
     *   @Target(ElementType.ANNOTATION_TYPE)           // 注解
     *
     *   @Target(ElementType.PACKAGE)                   // 包
     *
     * 5.注解包含在javadoc中:
     *
     *   @Documented
     *
     * 6.注解可以被继承:
     *
     *   @Inherited
     *
     * 7.注解解析器:用来解析自定义注解。
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface MyAnno {
        //注解的属性
        String name() default "rose";
    
        String value() default "jack";
    }
    

    2、用于属性:

    /**
     * 一个属性中使用了自定义注解的对象
     */
    public class Person {
        @MyAnno(name="tom")
        private String name;
    
        private int    age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }

    3、测试类与注解值得获取:

    /**
     * 测试类
     * @param <T>
     */
    public class TestClass<T> {
        /**
         * 主方法
         * @param args
         */
        public static void main(String[] args) {
            Person person = getPerson(Person.class);
    
            System.out.println(person.getName());
        }
    
        /**
         * 通过反射获取注解的值
         * @param clz
         * @return
         */
        public static Person getPerson(Class clz){
            Person person =null;
            try {
                person = (Person)clz.newInstance();
                //获取属性
                Field[] fields = clz.getDeclaredFields();
                for(Field field : fields){
                    //是否被特定注解修饰
                    boolean fieldHasAnno = field.isAnnotationPresent(MyAnno.class);
                    if(fieldHasAnno){
                        MyAnno fieldAnno = field.getAnnotation(MyAnno.class);
                        //注入注解属性
                        String name = fieldAnno.name();
                        person.setName(name);
    
                    }
                }
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
    
            return person;
        }
    
    
    
        private T obj;
    
        public T getObj(){
            return  obj;
        }
    
        public TestClass(T obj) {
            this.obj = obj;
        }
    }
    

    4、执行结果,是注解中的name属性的值,测试完成。

    
    tom
  • 相关阅读:
    OC_框架学习第一天
    OC_协议与分类的学习
    OC内存分析之retain与copy的简单测试示例
    OC类的使用,属性声明与复合类的实现示例
    PL/SQL破解方法(不需要注册码)
    C# Winform应用程序占用内存较大解决方法整理
    分享一个控制台版本《推箱子》小游戏,感兴趣的可以看看
    每天定时去女友空间留言工具(首选你要有个女友。!哈哈哈哈)
    单例模式(Singleton)详解——转载
    easyUI的datagrid控件日期列不能正确显示Json格式数据的解决方案
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054103.html
Copyright © 2011-2022 走看看