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,@Suppr ...
- 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),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...
随机推荐
- vim基本命令之剪切复制粘贴替换
首先是剪切(删除): 剪切其实也就顺带删除了所选择的内容,所以既可以当剪切命令用,也可以当删除命令使用. 1 首先,可以在命令模式下输入v进入自由选取模式,选择需要剪切的文字后,按下d就可以进行剪切了 ...
- asp.net 微信开发失效汇总
1.验证控件 在Iphone 5以上版本不兼容(改为js验证)
- 表单 阻止 技巧 JavaScript js
阻止表单的提交,可以用return false 来进行阻止 长度不低于6,不高于20 if(username.length < 6 || username>20){ alert (&quo ...
- disable_irq与disable_irq_nosync使用场景
disable_irq与disable_irq_nosync使用场景 Linux设备驱动,关于中断屏蔽有两个接口:disable_irq和disable_irq_nosync,该两接口使用场景 ...
- Spark相关
非常好的spark分析博客,我们team的,哈哈:http://jerryshao.me/ spark programming guide: https://github.com/mesos/spar ...
- linux下给网卡加VLAN标签和私网地址
1.加载8021q协议 moprobe 8021q 2.安装必要的包 yum -y groupinstall base linux 3.添加私网地址(写到开机启动项) vconfig add bond ...
- mybatis.xml文件中#与$符号的区别以及数学符号的处理
1.#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入. #{}可以接收简单类型值或po ...
- mysql replace
replace(object, search,replace) 示例:update table set col1 = replace(col1, 'a', 'A'); 将col1字段中的小写a替换成大 ...
- 随机生成验证码import random
#!/usr/bin/env python import random temp = "" for i in range(6) : num = random.randrange(0 ...
- 通过sharedpreferences实现记住密码功能
通过sharedpreferences实现记住密码功能