二十七、JDK1.5新特性---Annotation
上篇文章介绍了反射的一些基础知识以及应用案例,本文将介绍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的更多相关文章
- JDK1.8新特性之(二)--方法引用
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)
5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- JDK1.8新特性之(三)--函数式接口
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- JDK1.8新特性之(一)--Lambda表达式
近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...
- JDK1.8新特性(一): 接口的默认方法default
前言 今天在学习mysql分区优化时,发现一个博客专家大神,对其发布的文章简单学习一下: 一:简介 我们通常所说的接口的作用是用于定义一套标准.约束.规范等,接口中的方法只声明方法的签名,不提供相应的 ...
随机推荐
- [IOS] 利用@IBInspectable
某些uiview中设置 这个关键字 IBInspectable 可以让其设置的属性,在右侧的属性栏目里面进行直接设置, 这是最近看了一下wwdc的一个视频学习到的,可以方便的进行 UI的测试,
- 利用box-shadow绘图
上篇博客提到过,box-shadow属性的本质是对形状的复制,那么如果我设置一个1*1px的i标签,利用box-shadow可以叠加的特性,给每一个1*1px的阴影赋上颜色,那么最后不就是一幅图片了么 ...
- 关于ps中的锯齿
1.1 索引透明颜色与Alpha透明通道 要说索引颜色透明,首先要讲讲什么是索引颜色,百度百科上有对索引颜色的解释,我觉得很关键的一句是“挑选一副图片中最有代表性的若干种颜色(通常不超过256种) ...
- Django入门1
Django中的应用是以APP形式存在的,这是Django的主要特色. 入门--Hello,Django 在mysite中新建文件views.py,并在里面定义方法hello: 这里#-*- ...
- 折腾一两天,终于学会使用grunt压缩合并混淆JS脚本,小激动,特意记录一下+spm一点意外收获
很长时间没有更新博客了,实在是太忙啦...0.0 ,以下的东西纯粹是记录,不是我原创,放到收藏夹还担心不够,这个以后常用,想来想去,还是放到这里吧,,丢不了..最后一句废话,网上搜集也好原创也罢,能解 ...
- Android 学习路线图
- swift-懒加载
override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.cyan self.navi ...
- mvc学习(二)
1.后台foreach 与 html的关系 <table border="1">@for (var i = 0; i < 10; i++){@Html.Raw(i ...
- INotifyPropertyChanged, Interface
Data Object(class) impliment INotifyPropertyChanged; then the Object can update BindingSource. Impli ...
- JAVA基础篇NO2--Java中的基本命名规则及数据类型
1.Java中的常量及进制 1.常量: 在程序运行的过程中,不可以改变的量,就是常量 boolean类型的值只能是true或者false null: 空常量, 代表不存在! ------------- ...