上篇文章介绍了反射的一些基础知识以及应用案例,本文将介绍jdk 1.5 出现的新特性——Annotation也就是我们所说的注解,即使用注释的方式加入一些程序的信息。

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。

Java.lang.annotation. Annotation 接口是所有的Annotation都必须实现的接口。下面我们将从系统的三个内建Annotation开始学习。

内建Annotation

♥ @Overrider :复写的Annotation

♥ @Deprecated : 不赞成使用的Annotation,通常表示过时

♥ @SuppressWarnings :压制安全警告的Annotation

Overrider作用与用法

表示当前方法是在复写父类的方法,当我们复写父类的一个方法时可以在方法上面写上@ Overrider,其作用是验证该方法是否拼写错误,如果编写错误则编译失败。从而提高了程序的安全性

Deprecated作用与用法

通常表示当前方法不建议使用或者是已经因为某种原因已经过时,现在有更好的方法,从而保证程序的健壮性

SuppressWarnings作用与用法

用于压制强制警告信息,以之前介绍的泛型操作为例,在泛型中如果没有指定泛型类型则在编译时期会出现安全警告,而如果加上@SuppressWarnings则可以将安全警告强制压制。

自定义Annotation

当我们系统Annotation不能满足我们的需求时,我们就可以自定义Annotation。

格式

[public ] @interface Annotation 名称{ 

        数据类型 变量名称(); 

   }

按照上述格式自定义一个简单的Annotation。

public @interface MyDefaultAnnotationNoneParam{     

  }

之后就可以直接在程序中使用@ MyDefaultAnnotationNoneParam了。

此外还可以向Annotation中设置参数,使用变量接受参数

public @interface MyDefaultAnnotationSingleParam{ 

    public String value() ;    // 接收设置的内容 

}

在使用的时候就必须指定变量的值

@ MyDefaultAnnotationSingleParam("月芽之上") 

class Demo{ 

}

或者也可以使用明确的标记,表示内容赋值给那个参数

public @interface MyDefaultAnnotationMoreParam{ 

    public String key(); 

public String value() ;    // 接收设置的内容 

}

此时Annotation在使用的时候需要设置两个参数。一个是key、一个事value.

@ MyDefaultAnnotationMoreParam (key="月芽之上",value="李占祥") 

class Demo{ 

}

也可以设置一个数据进去

public @interface MyDefaultAnnotationArrayParam{ 

    public String[] value() ;    // 接收设置的内容 

}

接收的内容本身是一个数组类型,需要传递数据,这一点类似于SuppressWarnings

@ MyDefaultAnnotationArrayParam ({ "月芽之上","李占祥"}) 

class Demo{ 

}

以上所定义的全部的Annotation中有一个特点,就是所有的参数内容需要在使用注释的时候设置上去,那么也可以为一个参数设置默认的内容,在声明的时候使用default即可。

public @interface MyDefaultAnnotationParam{ 

    public String key() default "月芽之上"; 

public String value()default "李占祥" ;    // 接收设置的内容 

}

如果设置了默认值,那么在使用Annotation时就可以不设置内容了(使用默认值)。

在以上操作中,对于一个Annotation而言 有时候会取固定的取值范围,只能取固定的几个值,那么这时候就需要依靠枚举来实现。

public enum MyName{    // 定义枚举类型 

    月芽之上,李占祥; 

}

以后的Annotation的取值,只能从这两个值中间去取。

public @interface MyDefaultAnnotationEnum{ 

    public String name() default MyName."月芽之上"; 

}

此时以上的Annotation已经设置好了一个枚举中的内容作为默认值,那外部在使用此Annotation的时候也需要从枚举的固定值中取。

Retention和RetentionPolicy

在定义Annotation时可以使用Retention定义一个Annotation的保存范围,此Annotation的定义如下:

@Documented

@Retention(vale=RUNTIME)

@Target(vale=ANNOTATION_TYPE)

public @interface Retention{

RetentionPolicy value();

}

在以上的Retention定义中定义了一个RetentionPolicy的变量,此变量用于指定Annotation的保存范围。范围分为三种:

在三个范围中,最需要关心的即使RUNTIME范围,因此此时在执行的时候气作用。

通过反射取得Annotation内容

一个Annotation如果要想变得有意义,就必须结合反射机制取得Annotation中设置的全部内容。

取得Annotation内容的常见方法

package reflectannotation ; 

public class SimpleBeanOne{ 

    @SuppressWarnings("unchecked") 

    @Deprecated 

    @Override 

    public String toString(){ 

        return "Hello LiXingHua!!!" ; 

    } 

}

同时设置了三个Annotation,那么此时注意,只有Deprecated的Annotation定义的范围是RUNTIME范围,所以此时通过反射只能取得一个。

import java.lang.annotation.Annotation ; 

import java.lang.reflect.Method ; 

public class ReflectDemo01{ 

    public static void main(String args[]) throws Exception{    // 所有异常抛出 

        Class <?> c = null ; 

        c = Class.forName("reflectannotation.SimpleBeanOne") ; 

        Method toM = c.getMethod("toString") ;    // 找到toString()方法 

        Annotation an[] = toM.getAnnotations() ;    // 取得全部的Annotation 

        for(Annotation a:an){    // 使用 foreach输出 

            System.out.println(a) ; 

        } 

    } 

}

以上的操作代码实际是通过三个系统内建的Annotation完成的,那么特可以自定义一个Annotation

package reflectannotation ; 

import java.lang.annotation.Retention ; 

import java.lang.annotation.RetentionPolicy ; 

@Retention(value=RetentionPolicy.RUNTIME)    // 此Annotation在类执行时依然有效 

public @interface MyDefaultAnnotationReflect{ 

    public String key() default "月芽之上" ; 

    public String value() default "李占祥" ; 

}

以上的Annotation范围是在运行时依然有效,下面定义一个类使用该Annotation。

package reflectannotation ; 

public class SimpleBeanTwo{ 

    @SuppressWarnings("unchecked") 

    @Deprecated 

    @Override 

    @MyDefaultAnnotationReflect(key="月芽之上",value="李占祥") 

    public String toString(){ 

        return "Hello lzx!!!" ; 

    } 

}

下面通过反射取得指定的Annotation,因为现在唯一设置的内容就是MyDefaultAnnotationReflect

import reflectannotation.MyDefaultAnnotationReflect ; 

import java.lang.annotation.Annotation ; 

import java.lang.reflect.Method ; 

public class ReflectDemo02{ 

    public static void main(String args[]) throws Exception{    // 所有异常抛出 

        Class <?> c = null ; 

        c = Class.forName("reflectannotation.SimpleBeanTwo") ; 

        Method toM = c.getMethod("toString") ;    // 找到toString()方法 

        if(toM.isAnnotationPresent(MyDefaultAnnotationReflect.class)){ 

            // 判断是否是指定的Annotation 

            MyDefaultAnnotationReflect mda = null ; 

            mda = toM.getAnnotation(MyDefaultAnnotationReflect.class) ;    // 得到指定的Annotation 

            String key = mda.key() ;    // 取出设置的key 

            String value = mda.value() ;    // 取出设置的value 

            System.out.println("key = " + key) ; 

            System.out.println("value = " + value) ; 

        } 

    } 

}

二十七、JDK1.5新特性---Annotation的更多相关文章

  1. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  2. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  3. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  4. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  5. JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)

    5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...

  6. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  7. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  8. JDK1.8新特性之(一)--Lambda表达式

    近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...

  9. JDK1.8新特性(一): 接口的默认方法default

    前言 今天在学习mysql分区优化时,发现一个博客专家大神,对其发布的文章简单学习一下: 一:简介 我们通常所说的接口的作用是用于定义一套标准.约束.规范等,接口中的方法只声明方法的签名,不提供相应的 ...

随机推荐

  1. git add 命令

    git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件. 注意 -A 选项后面还有一个句点. git add -A表示添加所有内容 ...

  2. SQl中的char,varcher,nvarchar,txt

    CHAR    char是定长的,在字段建立时,空间就固定了,不管是否插入值(NULL也包含在内),都占用字符的空间.例如: char(8),输入字符小于8,后面补空值.输入字符大于8时,会截取.CH ...

  3. asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(四)

    有网友问及权限的问题,其实我觉得没什么改进. 主目录下的web.config基本不用改.要说要改的也就只有数据库连接了. <authentication mode="None" ...

  4. CSS方法论完全总结

    软件开发领域所有的工程问题,归根结底衍生自一个问题:代码量大了怎么办? 对于CSS而言,因代码量增大导致的核心问题是命名冲突. 解决命名冲突的方法论是模块化,围绕此方法论,演化出种种模块化方案. 一. ...

  5. 掌握Thinkphp3.2.0----连贯操作

    其实在TP中,说起来语句中的各个关键词都被封装成了函数,将各个由关键词演变来的函数连起来就是所谓的连贯操作.只要注意各个函数直接参数传递的区别就可以了. 再者,不是所有的函数都可以进行连贯操作!!!比 ...

  6. SqlServer查询日期时间范围条件

    --查询当天:   select * from info where DateDiff(dd,datetime,getdate())=0     --查询24小时内的: select * from i ...

  7. sublime通用快捷键 汉化 安装 插件

    Ctrl+Alt+P     切换项目 1.Ctrl+Shift+P     打开Package Control     Ctrl + Shift + P ,输入View, 选择Toogle Tabs ...

  8. C++ 环形缓冲区的实现

    参考文章:http://blog.csdn.net/linyt/article/details/53355355 本文参考linux系统中 kfifo缓冲区实现.由于没有涉及到锁,在多线程环境下,只适 ...

  9. mysql 联合查询后update

    SELECT a.user_name,a.avatar,a.nicheng,a.user_rank,b.rank_name,b.rank_img FROM ecs_users a , ecs_user ...

  10. Bypass WAF Cookbook

    PS.之前一直想把零零碎碎的知识整理下来,作为知识沉淀下来,正好借着wooyun峰会的机会将之前的流程又梳理了一遍,于是就有了下文.也希望整理的内容能给甲方工作者或则白帽子带来一些收获. 0x00 概 ...