• 限定重写父类方法:@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也可以带成员变量,成员声明和接口方法声明类似,成员的声明有以下几点限制:

  1. 成员以无入参无抛出异常的方式声明,如boolean value(String str)/boolean value() throws Exception等都是非法的。
  2. 可以通过default为成员指定一个默认值,当然也可以不指定。
  3. 成员类型是受限的,合法的类型包括基本类型及其包装类型,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相关推荐

  1. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  2. java疯狂讲义输入输出视频_疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件...

    在Java中,把这些不同类型的输入.输出抽象为流(Stream),而其中输入或输出的数据称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了. 首先我要声明下:所谓的输入输 ...

  3. 《疯狂Java讲义》学习笔记 第六章 面向对象(下)

    <疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...

  4. [疯狂Java讲义精粹] 第十三章|类加载机制与反射

    java.lang.reflect包下的接口和类, 包括Class, Method, Filed,Constructor和Array等, 这些类分别代表类, 方法, Field, 构造器和数组, Ja ...

  5. 《疯狂Java讲义》读书笔记5

    目录 Java的集合类 Inerator 接口 Set 集合 HashSet 类 LinkedHashSet 类 TreeSet 类 EnumSet 类 List 集合 ArrayList 和 Vec ...

  6. 《疯狂JAVA讲义》学习笔记(一)

    本人之前一直从事iOS开发,最近开始接触Eclipse插件开发,打算先重拾一下扔了很久的Java.看到大家都在网上推荐李刚的<疯狂JAVA讲义>,于是下了一本开始学习.以下为前七章本人记录 ...

  7. 疯狂Java讲义(六)----第四部分

    1.枚举类 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象.这种实例有限而且固定的类,在Java里被称为枚举类. 在早期代码中,可能会直接使用简 ...

  8. 疯狂java讲义第五章课后习题答案

    1.编写一个学生类,提供name.age.gender.phone.address.cmail成员变量,且为每个成员变量提供 seter.geter方法.为学生类提供默认的构造器和带所有成员变量的构造 ...

  9. 学习《疯狂Java讲义第4版》PDF+代码+课件+面试题分析

    学习java选择了<疯狂java讲义>最新的第四版,用了两个多月时间看完,一边阅读,一边敲代码.对Java有了不少新的认识.书中实例清晰明了,讲解也是娓娓道来.Java可以编写图形桌面系统 ...

  10. 【社区图书馆】疯狂 Java 讲义:但凡种种,不一而足

    虽说酒香不怕巷子深,但是千里之外并不一定能闻到,有人看到这可能会感觉这不免有些杠的味道,其实我想表达的是好酒也需要宣传,比如今天我所要讲的这本书<疯狂Java讲义>. 这不是[赠书活动], ...

最新文章

  1. 在JAVA读取Excel数据的日期格式
  2. 自我总结(四) ---java web项目完结,j2ee的开始
  3. Linux tmux分屏工具
  4. mysql 5.5 barracuda_MySQL Antelope和Barracuda的区别分析
  5. 基于情感脑电信号时-频-空特征的3D密集连接网络
  6. Boostrap技能点整理之【网格系统】
  7. payara 创建 集群_使用Payara Micro的Easy Java EE Microservices
  8. hadoop学习日志
  9. php imagefill,PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
  10. 浏览器userAgent大全
  11. css最好看最全的按钮样式,动画效果大全,纯css样式
  12. python list 迭代_python迭代、列表生成式
  13. ANDROID_MARS学习笔记_S01原始版_009_下载文件
  14. MySQL对数据的基本操作三:UPDATE语句
  15. java中的switch case语句
  16. Win10 免快捷键进BIOS
  17. HTML5之10 __使用 Canvas API创建 热点图
  18. Android 登录3D翻转动画效果
  19. 网络设备配置与管理————10、命令行接口
  20. C++Primer之4.6枚举读书笔记

热门文章

  1. Java连接SQLite数据库
  2. Phpcms V9全站伪静态设置方法
  3. MSSQL差异备份拿shell(转)
  4. 统一建模语言UML轻松入门之用例
  5. 说道说道 ios 图片尺寸的问题
  6. 让我变得开朗了很多哦
  7. 为什么要挖Chia币
  8. 人究竟能抠到什么程度?
  9. 为什么电商越来越难做了?
  10. 怎样的销售能快速成交别人?