zoukankan      html  css  js  c++  java
  • 注解工作原理详解

    我们自定义的注解其实不会发挥作用,很好明白的,因为我们的注解只是名字具有我们所需要的作用,换句话说,我们可以命名为任何名字,这个时候就无法确定注解的功能了。

    而java自带的注解(jdk1.5开始才有注解)另外有一套代码来确定这个注解的作用,那么下面我们就自己来写这套代码,来实现自己所定义的注解的作用(需要用到反射知识)

    下面是一个普通的注解作用是给成员变量赋默认值

    package ReasonTest;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface Autowired {
    
    }

    下面是使用这个注解的一个类,如果没有reflect方法,date为null  但是现在date是有时间的。

    package ReasonTest;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class LoginService {
    
        @Autowired
        public static Date date;
        
        public static void login() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh-mm-ss");
            String result = sdf.format(date);
            System.out.println(result);
        }
        
        public static void main(String[] args) {
            Reflect.reflect(LoginService.class);
            login();
        }
    }

    不报空指针错误就是因为Reflect.reflect(LoginService.class);的执行,这行代码用反射的方法给date赋予了初始值

    package ReasonTest;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Field;
    import java.lang.reflect.Type;
    
    public class Reflect {
    
        public static void reflect(Class clazz) {
            Field [] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                Annotation [] annotations = field.getAnnotations();
                for (Annotation annotation : annotations) {
                    if(annotation instanceof Autowired) {
                        Class type = (Class)field.getGenericType();
                        try {
                            field.set(clazz.newInstance(),type.newInstance() );
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (InstantiationException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    至此,我们就完成了@Autowired的作用,如有任何疑问,欢迎提出0.0

  • 相关阅读:
    从无到有制作Deb包的一个实例
    Redis内存存储结构分析
    岳麓实践论
    金砖四国(巴西、俄罗斯、印度和中国)
    用LLVM开发新语言
    QQ云输入法
    http://baike.baidu.com/view/1926473.htm
    21世纪商业评论
    update ubuntu to 11.10
    gnu make 中文手册教程pdf
  • 原文地址:https://www.cnblogs.com/lyxcode/p/9377897.html
Copyright © 2011-2022 走看看