当前位置: 首页 > news >正文

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的源代码了。欢迎讨论。





转载于:https://www.cnblogs.com/yutingliuyl/p/6917263.html

相关文章:

  • 基于 Web 的 Go 语言 IDE - Wide 1.1.0 公布!
  • pageoffice相关问题整理
  • less学习笔记三
  • Dwg,png,jpg,Dxf格式转换
  • 文件备份同步rsync
  • S#arp Darc 增加新的分支,改进了 CQRS 模式
  • mysql之 mysqldump 备份恢复详解
  • 微软宣布任命纳德拉为CEO 盖茨辞去董事长职位
  • Netflix 的开源文化与技术
  • 看不懂的故事
  • EAServer 的常做的配置
  • 《配置管理最佳实践》——第2章 构建工程 2.1为什么构建工程如此重要
  • 恶意软件感染 MySQL 服务器,成为全球 DDoS 之一
  • ubuntu14.04无法安装Curl
  • php之常量
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • HTTP中GET与POST的区别 99%的错误认识
  • input实现文字超出省略号功能
  • js ES6 求数组的交集,并集,还有差集
  • scrapy学习之路4(itemloder的使用)
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • TypeScript迭代器
  • 反思总结然后整装待发
  • 经典排序算法及其 Java 实现
  • 那些被忽略的 JavaScript 数组方法细节
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 选择阿里云数据库HBase版十大理由
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • #includecmath
  • #Z2294. 打印树的直径
  • (13)Hive调优——动态分区导致的小文件问题
  • (2020)Java后端开发----(面试题和笔试题)
  • (9)目标检测_SSD的原理
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (三) diretfbrc详解
  • (十五)使用Nexus创建Maven私服
  • (四)鸿鹄云架构一服务注册中心
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)LINQ之路
  • (转)ObjectiveC 深浅拷贝学习
  • (转)人的集合论——移山之道
  • ******之网络***——物理***
  • .gitignore文件设置了忽略但不生效
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Micro Framework初体验
  • .Net MVC + EF搭建学生管理系统
  • @JsonSerialize注解的使用
  • @RequestBody的使用
  • [] 与 [[]], -gt 与 > 的比较
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [20190401]关于semtimedop函数调用.txt
  • [HNOI2015]实验比较
  • [java后端研发]——文件上传与下载(2种方式)
  • [LeetCode] Merge Two Sorted Lists