zoukankan      html  css  js  c++  java
  • 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的源代码了。欢迎讨论。





  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6917263.html
Copyright © 2011-2022 走看看