• JAVA注解引发的思考



    自从JDK1.5引入@override,@Deprecated。@SuppressWarnings这三个注解和自己定义注解后,注解開始如火如荼地发展起来。如今非常多框架都支持注解,注解能够使我们的代码看起来更简洁,并且在一定程度上解除了类原有特性和扩展特性之间的耦合。

     为什么加上@Override,当前的方法就定义将覆盖超类中的方法,假设不覆盖就编译报错?

     为什么使用加上@Deprecated的。编译器将发出警告,这是弃用的代码?

     为什么加上@SuppressWarnings,编译器就不再发出警告信息?


    为什么我说:注解能够使我们的代码看起来更简洁,并且在一定程度上解除了类原有特性和扩展特性之间的耦合?

    不知道从什么时候。我開始讨厌往博客上贴大片的代码。还是不想贴。但要说明这几个问题,还是不得不用代码说事。

    我们来写一个注解,你就明确怎么回事了。

    我们来仿照@Deprecated。写一个极简的@MyDeprecated吧。实现的效果和@Deprecated一样。

    package com.jialin.test.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @Author : JiaLin
     * @Group : TGB
     * @Date : 2014/6/9
     * @Description :
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyDeprecated {
        public String description() default "Warning:This method is Deprecated!";
    }
    
    
    
    
    
    

    对以上元注解(元注解,说白了就是注解的注解)的简要说明

    @Target

    表示该注解能够用于什么地方。可能的ElementType參数有:

    CONSTRUCTOR:构造器的声明

    FIELD:域声明(包含enum实例)

    LOCAL_VARIABLE:局部变量声明

    METHOD:方法声明

    PACKAGE:包声明

    PARAMETER:參数声明

    TYPE:类、接口(包含注解类型)或enum声明

    @Retention

    表示须要在什么级别保存该注解信息。可选的RetentionPolicy參数包含:

    SOURCE:注解将被编译器丢弃

    CLASS:注解在class文件里可用,但会被VM丢弃

    RUNTIME:VM将在执行期间保留注解,因此能够通过反射机制读取注解的信息。

    @Document

    将注解包括在Javadoc中

    @Inherited

    同意子类继承父类中的注解



    package com.jialin.test.annotation;
    
    import java.lang.reflect.Method;
    
    /**
     * @Author : JiaLin
     * @Group : TGB
     * @Date : 2014/6/9
     * @Description :
     */
    public class MyClass {
    
        @MyDeprecated
        public String sayHelloWorld()
        {
            return "Hello,World!";
        }
    
        public String sayHelloJiaLin()
        {
            return "Hello,Jialin!";
        }
    
    
        public static void main(String[] args) {
            testMyDeclared(MyClass.class);
        }
    
        public static void testMyDeclared(Class<?> myClass) {
            for (Method method : myClass.getDeclaredMethods()) {
    
                MyDeprecated myDeprecated = method.getAnnotation(MyDeprecated.class);
                if (myDeprecated != null) {
                    System.out.println(myDeprecated.description()+method.getName());
                }
            }
        }
    
    }
    

    输出结果:Warning:This method is Deprecated! sayHelloWorld

    看了代码,相信文章开头那几个问题就不用过多解释了。

    事实上,之所以会研究注解,也是因为我近期一直在想怎么让项目的非常多地方解耦合,注解就是当中一个不错的方法。比如同一个查询方法。加上不同的注解,它查询的表就不一样或者说结果就不一样。
    结合上枚举,反射和拦截器,我们就能够达到这种效果。还是一种延时注入的思想。思路例如以下:我们开辟一个静态区域作为容器,然后存放我们的枚举值,然后利用拦截器拦截到要运行的方法,通过反射获取这种方法的注解。然后将注解的属性与我们的枚举值匹配,假设匹配成功,那么改动方法的參数。

    写到这,我忽然意识到,Spring的IOC容器大概也是这么个思路,看样子是时候好好读读spring的源代码了。欢迎讨论。





  • 相关阅读:
    MySQL修改root密码的多种方法
    (转)云存储:阿里云OSS 、又拍云和 七牛 的比较
    微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨
    Feed系统架构资料收集
    百万用户时尚分享网站feed系统扩展实践
    (转)浅谈MD5加密算法中的加盐值(SALT)
    json转换成list map集合
    android在假设绘制自己定义的bitmap,然后返回给ImageView
    APPCAN学习笔记003---原生开发与HTML5技术
    【问题解决】syntax error: unexpected end of file或-bash: ./full_build.sh: /bin/bash^M: bad interpreter: No
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6917263.html
Copyright © 2020-2023  润新知