《疯狂Java讲义》(三十)---- Annotation
- 限定重写父类方法:@Override
作用是告诉编译器检查这个方法,保证父类要包含一个被该方法重写的方法,否则就会编译出错。
- 标记已过时:@Deprecated
用于表示某个程序元素(类或方法)已过时,当其他程序使用已过时的类或方法时,编译器会给出警告。
- 抑制编译器警告:@SuppressWarnings
指示被该Annotation修饰的程序元素取消显示指定的编译器警告。@SuppressWarnings会一直作用于该程序元素的所有子元素。
通常情况下,如果程序中使用没有泛型限制的集合将会引起编译器警告,为了避免这种编译器警告,可以使用@SuppressWarnings修饰。@SuppressWarnings(value="unchecked")
用于修饰Annotation的Annotation
- @Retention
只能用于修饰一个Annotation定义,用于指定被修饰的Annotation可以保留多长时间。
@Retention(value = RetentionPolicy.RUNTIME) public @interface Testable()
或者也可以省略value
@Retention(RetentionPolicy.SOURCE) public @interface Testable()
表示Testable这个Annotation只保留在源码中,编译器会直接丢弃Retention为SOURCE的Annotation
- @Target
指定被修饰的Annotation能用于修饰哪些程序单元,如constructor,field,method,怕人阿meter,package等。
@Target(ElementType.Field) public @interface ActionListenerFor()
- @Documented
用于指定Annotation类将被javadoc工具提取成文档,如果定义Annotation类时使用了@Documented修饰,则所有使用该Annotation修饰的程序元素的API文档中将会包含该Annotation说明。
- @Inherited
指定被它修饰的Annotation将具有继承性----如果某个类使用了@A Annotation(A annotation使用了@Inherited修饰)修饰,则其子类将自动被@A 修饰。
- 自定义Annotation
定义新的Annotation类型使用@interface关键字,默认情况下,Annotation可用于修饰任何程序元素,包括类,接口,方法等。
public @interface Test { }
自定义Annotation也可以带成员变量,成员声明和接口方法声明类似,成员的声明有以下几点限制:
- 成员以无入参无抛出异常的方式声明,如boolean value(String str)/boolean value() throws Exception等都是非法的。
- 可以通过default为成员指定一个默认值,当然也可以不指定。
- 成员类型是受限的,合法的类型包括基本类型及其包装类型,String,Class,enums和注解类型以及上述类型的数组类型。自定义类型是不允许的。
如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=),如@NeedTest(true).注解类拥有多个成员时,如果仅对value成员进行赋值则也可以不使用赋值号,如果同时对多个成员进行赋值,则必须使用赋值号。注解类可以没有成员,没有成员的注解成为标识注解。
public @interface MyTag {String name() default "ivy";int age() default 18; }
public class Test {@MyTag(name="xx", age=6)public void info() {} }
当开发者使用Annotation修饰了类,方法,Field等成员后,这些Annotation不会自己生效,必须有开发者提供相应的工具来提取并处理Annotation信息。
Annotation[] aArray = Calss.forName("Test").getMethod("info").getAnnotations(); for(Annotation an : aArray) {if (an instanceof MyTag1) { System.out.println("tag.name():" + ((MyTag1)tag).method1()); }
if (an instanceof MyTag2) { System.out.println("tag.name():" + ((MyTag2)tag).method1()); }
}
Example:
package com.ivy.annotation;import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) @Target(value={METHOD}) public @interface Testable {}
package com.ivy.annotation;public class MyTest{@Testablepublic static void m1(){}public static void m2(){}@Testablepublic static void m3(){throw new RuntimeException("Boom");}public static void m4(){}@Testablepublic static void m5(){}public static void m6(){}@Testablepublic static void m7(){throw new RuntimeException("Crash");}public static void m8(){}}
package com.ivy.annotation;import java.lang.reflect.Method;public class ProcessTest {public static void process(String clazz) throws SecurityException, ClassNotFoundException {int passed = 0;int failed = 0;for(Method m : Class.forName(clazz).getMethods()) {if (m.isAnnotationPresent(Testable.class)) {try {m.invoke(null);passed++;} catch (Exception ex) {System.out.println("method" + m + "failed :" + ex.getCause());failed++;}}}System.out.println("All run methods :" + (passed+failed) + "passed :" + passed + "failed: " + failed);} }
package com.ivy.annotation;public class RunTest {public static void main(String[] args) throws SecurityException, ClassNotFoundException {// TODO Auto-generated method stubProcessTest.process("com.ivy.annotation.MyTest");}}
注意:Class.forName(String className) 此处className必须是class全称,包含包名。
转载于:https://www.cnblogs.com/IvySue/p/6396236.html
《疯狂Java讲义》(三十)---- Annotation相关推荐
- 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
- java疯狂讲义输入输出视频_疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件...
在Java中,把这些不同类型的输入.输出抽象为流(Stream),而其中输入或输出的数据称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了. 首先我要声明下:所谓的输入输 ...
- 《疯狂Java讲义》学习笔记 第六章 面向对象(下)
<疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...
- [疯狂Java讲义精粹] 第十三章|类加载机制与反射
java.lang.reflect包下的接口和类, 包括Class, Method, Filed,Constructor和Array等, 这些类分别代表类, 方法, Field, 构造器和数组, Ja ...
- 《疯狂Java讲义》读书笔记5
目录 Java的集合类 Inerator 接口 Set 集合 HashSet 类 LinkedHashSet 类 TreeSet 类 EnumSet 类 List 集合 ArrayList 和 Vec ...
- 《疯狂JAVA讲义》学习笔记(一)
本人之前一直从事iOS开发,最近开始接触Eclipse插件开发,打算先重拾一下扔了很久的Java.看到大家都在网上推荐李刚的<疯狂JAVA讲义>,于是下了一本开始学习.以下为前七章本人记录 ...
- 疯狂Java讲义(六)----第四部分
1.枚举类 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象.这种实例有限而且固定的类,在Java里被称为枚举类. 在早期代码中,可能会直接使用简 ...
- 疯狂java讲义第五章课后习题答案
1.编写一个学生类,提供name.age.gender.phone.address.cmail成员变量,且为每个成员变量提供 seter.geter方法.为学生类提供默认的构造器和带所有成员变量的构造 ...
- 学习《疯狂Java讲义第4版》PDF+代码+课件+面试题分析
学习java选择了<疯狂java讲义>最新的第四版,用了两个多月时间看完,一边阅读,一边敲代码.对Java有了不少新的认识.书中实例清晰明了,讲解也是娓娓道来.Java可以编写图形桌面系统 ...
- 【社区图书馆】疯狂 Java 讲义:但凡种种,不一而足
虽说酒香不怕巷子深,但是千里之外并不一定能闻到,有人看到这可能会感觉这不免有些杠的味道,其实我想表达的是好酒也需要宣传,比如今天我所要讲的这本书<疯狂Java讲义>. 这不是[赠书活动], ...
最新文章
- 在JAVA读取Excel数据的日期格式
- 自我总结(四) ---java web项目完结,j2ee的开始
- Linux tmux分屏工具
- mysql 5.5 barracuda_MySQL Antelope和Barracuda的区别分析
- 基于情感脑电信号时-频-空特征的3D密集连接网络
- Boostrap技能点整理之【网格系统】
- payara 创建 集群_使用Payara Micro的Easy Java EE Microservices
- hadoop学习日志
- php imagefill,PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
- 浏览器userAgent大全
- css最好看最全的按钮样式,动画效果大全,纯css样式
- python list 迭代_python迭代、列表生成式
- ANDROID_MARS学习笔记_S01原始版_009_下载文件
- MySQL对数据的基本操作三:UPDATE语句
- java中的switch case语句
- Win10 免快捷键进BIOS
- HTML5之10 __使用 Canvas API创建 热点图
- Android 登录3D翻转动画效果
- 网络设备配置与管理————10、命令行接口
- C++Primer之4.6枚举读书笔记