zoukankan      html  css  js  c++  java
  • Java中自定义注解类,并加以运用

    在Java框架中,经常会使用注解,而且还可以省很多事,来了解下自定义注解。

    注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响

    先写一个自己的注解类

    @Documented //会被javadoc命令识别
    @Retention(RetentionPolicy.RUNTIME) //相当于作用时期,比如:运行期、编译期
    @Target({ElementType.METHOD}) //相当于作用域,比如方法、类
    public @interface MyValue {
    
        String value();
        //也可以这么写,就是说,它的默认值是hello
        //String value() default "hello";
    
    }
    

    然后解析上边用到的那两个类:

    public enum RetentionPolicy {
    	SOURCE,
    	CLASS,
    	RUNTIME
    }
    
    public enum ElementType {
        /** Class, interface (including annotation type), or enum declaration */
        TYPE,
        FIELD,
        METHOD,
        PARAMETER,
        CONSTRUCTOR,
        LOCAL_VARIABLE,
        ANNOTATION_TYPE,
        PACKAGE
    }
    

    可以看到,是两个枚举类,也就是我们自定义的注解有一定的时间和空间作用域。
    好了,我们的自定义注解已经完成了(对的,自定义注解就上边那一段代码),那我们就来看看要怎么有用呢?很容易啊,就和其他的注解一样,写在我们要用到的地方就好了。(对的,我确定不是在开玩笑)

    public class Person {
        
        @MyValue(value="张三")
        private String name;
    
        /*
        为什么要写setter和getter,很快你就会知道
         */
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    然后我们在其他地方去拿

    Person person = new Person();
    System.out.println(person.getName());//null
    
    //这就很难受,按道理来说,不是应该是张三吗?
    

    大家都知道,像Spring这种框架都是通过反射来实现的,我们就模拟一个“编译类”,我们是在属性上用的注解,所以就先用反射来拿到类的所有属性

    public static void main(String[] args) throws NoSuchFieldException {
            Person person = new Person();
    
            //按理来说,我们是拿到这个Person.class的所有的属性,然后遍历,来挨个注入,但是这里我们明明确我们的属性名,所以就简单化了
            Field   field = Person.class.getDeclaredField("name");
    
            MyValue annotation = field.getAnnotation(MyValue.class);//拿到注解类
    
            String name = annotation.value();//这个value()就是我们在MyValue类中的的属性
    
            //然后我们就注入到这个类中,这时就用到了setter方法
            person.setName(name);
    
            System.out.println("通过自定义注解后的person的name是:" + person.getName());
        }
    

    是的,这样我们就通过了自定义注解给Person注入了一个name属性,但是在实际运用中不可能这么复杂,这只是入门了一下,我们可以将这个“模拟的编译类”组装成一个工具类,以便我们在实际中运用。

  • 相关阅读:
    磁盘缓存
    算法与追MM(转)
    人人都能上清华(转)
    软件加密技术和注册机制原理攻略(转)
    计算二重定积分
    C++运算符重载
    STL中list的用法
    累了??放松一下,看几张关于程序员的几张搞笑图片
    解决来QQ消息后歌曲音量降低问题
    搞ACM的你伤不起(转)
  • 原文地址:https://www.cnblogs.com/Lyn4ever/p/11594533.html
Copyright © 2011-2022 走看看