Java注释@interface的用法
转----------
java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。
@Override,@Deprecated,@SuppressWarnings为常见的3个注解。
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,
JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事。
注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法
的名字出错时,编译器就会报错,如图:

注解@Deprecated,用来表示某个类的属性或方法已经过时,不想别人再用时,在属性和方法
上用@Deprecated修饰,如图:

注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候,
如图:

注解@Retention可以用来修饰注解,是注解的注解,称为元注解。
Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.
- package com.self;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- @Retention(RetentionPolicy.RUNTIME)
- public @interface MyTarget
- { }
- 定义个一注解@MyTarget,用RetentionPolicy.RUNTIME修饰;
- package com.self;
- import java.lang.reflect.Method;
- public class MyTargetTest
- {
- @MyTarget
- public void doSomething()
- {
- System.out.println("hello world");
- }
- public static void main(String[] args) throws Exception
- {
- Method method = MyTargetTest.class.getMethod("doSomething",null);
- if(method.isAnnotationPresent(MyTarget.class))//如果doSomething方法上存在注解@MyTarget,则为true
- {
- System.out.println(method.getAnnotation(MyTarget.class));
- }
- }
- }
- 上面程序打印:@com.self.MyTarget(),如果RetentionPolicy值不为RUNTIME,则不打印。
- @Retention(RetentionPolicy.SOURCE )
- public @interface Override
- @Retention(RetentionPolicy.SOURCE )
- public @interface SuppressWarnings
- @Retention(RetentionPolicy.RUNTIME )
- public @interface Deprecated
- 由上可以看出,只有注解@Deprecated在运行时可以被JVM读取到
- 注解中可以定义属性,看例子:
- @Retention(RetentionPolicy.RUNTIME)
- public @interface MyAnnotation
- {
- String hello() default "gege";
- String world();
- int[] array() default { 2, 4, 5, 6 };
- EnumTest.TrafficLamp lamp() ;
- TestAnnotation lannotation() default @TestAnnotation(value = "ddd");
- Class style() default String.class;
- }
- 上面程序中,定义一个注解@MyAnnotation,定义了6个属性,他们的名字为:
- hello,world,array,lamp,lannotation,style.
- 属性hello类型为String,默认值为gege
- 属性world类型为String,没有默认值
- 属性array类型为数组,默认值为2,4,5,6
- 属性lamp类型为一个枚举,没有默认值
- 属性lannotation类型为注解,默认值为@TestAnnotation,注解里的属性是注解
- 属性style类型为Class,默认值为String类型的Class类型
- 看下面例子:定义了一个MyTest类,用注解@MyAnnotation修饰,注解@MyAnnotation定义的属性都赋了值
- @MyAnnotation(hello = "beijing", world="shanghai",array={},lamp=TrafficLamp.RED,style=int.class)
- public class MyTest
- {
- @MyAnnotation(lannotation=@TestAnnotation(value="baby"), world = "shanghai",array={1,2,3},lamp=TrafficLamp.YELLOW)
- @Deprecated
- @SuppressWarnings("")
- public void output()
- {
- System.out.println("output something!");
- }
- }
- 接着通过反射读取注解的信息:
- public class MyReflection
- {
- public static void main(String[] args) throws Exception
- {
- MyTest myTest = new MyTest();
- Class<MyTest> c = MyTest.class;
- Method method = c.getMethod("output", new Class[] {});
- //如果MyTest类名上有注解@MyAnnotation修饰,则为true
- if(MyTest.class.isAnnotationPresent(MyAnnotation.class))
- {
- System.out.println("have annotation");
- }
- if (method.isAnnotationPresent(MyAnnotation.class))
- {
- method.invoke(myTest, null); //调用output方法
- //获取方法上注解@MyAnnotation的信息
- MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
- String hello = myAnnotation.hello();
- String world = myAnnotation.world();
- System.out.println(hello + ", " + world);//打印属性hello和world的值
- System.out.println(myAnnotation.array().length);//打印属性array数组的长度
- System.out.println(myAnnotation.lannotation().value()); //打印属性lannotation的值
- System.out.println(myAnnotation.style());
- }
- //得到output方法上的所有注解,当然是被RetentionPolicy.RUNTIME修饰的
- Annotation[] annotations = method.getAnnotations();
- for (Annotation annotation : annotations)
- {
- System.out.println(annotation.annotationType().getName());
- }
- }
- }
- 上面程序打印:
- have annotation
- output something!
- gege, shanghai
- 3
- baby
- class java.lang.String
- com.heima.annotation.MyAnnotation
- java.lang.Deprecated
- 如果注解中有一个属性名字叫value,则在应用时可以省略属性名字不写。
- 可见,@Retention(RetentionPolicy.RUNTIME )注解中,RetentionPolicy.RUNTIME是注解属性值,属性名字是value,
- 属性的返回类型是RetentionPolicy,如下:
- public @interface MyTarget
- {
- String value();
- }
- 可以这样用:
- @MyTarget("aaa")
- public void doSomething()
- {
- System.out.println("hello world");
- }
- 注解@Target也是用来修饰注解的元注解,它有一个属性ElementType也是枚举类型,
- 值为:ANNOTATION_TYPE CONSTRUCTOR FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER TYPE
- 如@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上。
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface MyTarget
- {
- String value() default "hahaha";
- }
- 如把@MyTarget修饰在类上,则程序报错,如:
- @MyTarget
- public class MyTargetTest
- 注解大都用在开发框架中吧,好了有关注解就学习那么多了,谢谢。
Java注释@interface的用法的更多相关文章
- Java注释@interface的用法【转】
Java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类.@Override,@Deprecated,@SuppressWarnings为 ...
- Java注释@interface的用法【转】 --好文章 很好理解
java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类. @Override,@Deprecated,@SuppressWarnings ...
- java中自定义注释@interface的用法
一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...
- [转]自定义注释@interface的用法
一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...
- Java annotation 自定义注释@interface的用法
最近看到很多项目都是用了自定义注解,例如 1.什么是注解? 元数据(metadata),就是指数据的数据,元数据是描述数据的,就像数据库中的,表的字段,每一个 字段描述这个字段下面·的数据的含义,j2 ...
- Java 自定义注释@interface的用法
最简单的待校验的注解定义 @Documented @Constraint(validatedBy = ExistBlankByListValidator.class) @Target({PARAMET ...
- JAVA注释的另一种神奇用法
每个JAVA程序员在写程序的时候一定都会用到注释,本篇博客不是讲怎么定义注释,而是说明注释神奇的一种写法. /** * 这是一个测试类 */ public class Test { /** * 程序的 ...
- 转:十八、java中this的用法
http://blog.csdn.net/liujun13579/article/details/7732443 我知道很多朋友都和我一样:在JAVA程序中似乎经常见到“this”,自己也偶尔用到它, ...
- 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析
一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...
随机推荐
- 传统BIOS+UEFI 系统引导修复
一. 去网上下载一款pe软件:BIOS+UEFI引导修复工具这个软件支持传统bios和最新的UEFI引导(1)进入PE环境(win也可以,不过引导损坏一般不能进win),打开软件 ...
- Redis学习笔记四:独立功能之发布与订阅
客户端可以通过执行 subscribe 命令订阅一个或多个频道,每当有其他客户端向被订阅的频道发送消息时,频道所有的订阅者都会收到这条消息. 客户端还可以通过执行 psubscribe 命令订阅一个或 ...
- iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view
一.懒加载 只有使用到了商品数组才会创建数组 保证数组只会被创建一次 只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy - (void)viewDidLoad 控 ...
- phpcms 根据条件调取内容
asdasdsd <script> 正则 截取 function getUrlParam(name) { var reg = new RegExp("(^|&)" ...
- 取数据的前N行
用awk中csv文件中取前1000行出来,代码虽少,很容易出错 BEGIN{ FS=","; OFS=","; i=; } { i++; )exit; prin ...
- 单臂路由与三层交换机实现VLAN通信
不同VLAN之间相互通信的两种方式 (单臂路由.三层交换) 试验环境:东郊二楼第三机房 试验设备:Catalyst 2950-24(SW3) Cisco 2611( ...
- HDU 2855 斐波那契+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=2855 化简这个公式,多写出几组就会发现规律 d[n]=F[2*n] 后面的任务就是矩阵快速幂拍一个斐波那契模板出 ...
- transition第一次没有效果
原因很简单因为一开始没有设定要改变的样式的初始值 例如你要改的是top:-50; 那一开始就要设top:0; 不然第一次不会有动画效果移动
- Spring结合Quartz实现多任务定时调用(转载)
Quartz框架提供了丰富的任务调度支持,比如,在 何时执行何种任务,它是一个开源的由OpenSymphony维护的项目,开发者能够在Java EE,或单独的Java SE应用中使用它.无论是简单的任 ...
- .Net Framework 3.5, 3.5 sp1 中文版离线安装
安装.Net Framework 3.5和3.5 sp1时会自动下载语言包. 解决办法:下载语言包,将语言包拷贝到安装里. 1.用压缩工具解压.NetFramework3.5 2.将语言包文件拷贝到c ...