注解元数据分为4部分分别为Target,Documented,Inherited,Retention:



Target>指定被注解的注解仅仅能使用在某个类型上;ElementType指定其类型:能够为方法

字段,类,返回值等等;

声明:

/**
* @author Lean @date:2014-10-13
*/
@Target(ElementType.METHOD)
public @interface WorkInProgress {}

应用:

/**
* @author Lean @date:2014-10-13
*/
public class AnnotationSample { //当在字段中使用时:The annotation @WorkInProgress is disallowed for this location
//@WorkInProgress
private int age; @WorkInProgress
public static boolean doSomeThing() {
// TODO Auto-generated method stub
return false;
} }

Retention>设置注解可见性;使用到RetentionPolicy枚举

RetentionPolicy.SOURCE>>编译器可见,但对.class文件和执行时不可见;

RetentionPolicy.CLASS>>默认工具可见,对.class文件可见,但执行不可见;

RetentionPolicy.RUNTIME>>执行时可见;不会被.class文件所知,在执行时告诉JVM的值;

下面样例为执行时内省检查,当一个元注解须要多个限定值的时,必须使用{}和逗号隔开,

如@Target({ElementType.METHOD,ElementType.TYPE})

/**
* @author Lean @date:2014-10-13
*/
@WorkInProgress
public class AnnotationSample { private int age; @WorkInProgress
public static boolean doSomeThing() {
// TODO Auto-generated method stub
return false;
} public static void main(String[] args) {
AnnotationSample obj=new AnnotationSample();
Class clazz=obj.getClass();
WorkInProgress progress=(WorkInProgress) clazz.getAnnotation(WorkInProgress.class);
System.out.println(clazz.getName());
if (clazz.isAnnotationPresent(WorkInProgress.class)) {
System.out.println("class Annotationed WorkInProgress!");
}
Method[] methods=clazz.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(WorkInProgress.class)) {
System.out.println("method Annotationed WorkInProgress!");
}
}
} } @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@interface WorkInProgress {}

Documented>为加入注解的类书写文档,编译执行后执行javadoc的dos命令.就可以在该命令行

位置看到所生成的文档.



Inherited>当对某个类进行注解的时候,希望对继承他的子类也进行注解.默认情况下

没有使用该@Inherited注解方式,系统会觉得子类不须要继承该功能,例如以下:

/**
* @author Lean @date:2014-10-13
*/
@WorkInProgress
public class AnnotationSample { public static void main(String[] args) throws IllegalAccessException {
AnnotationSample obj=new AnnotationSample();
Class clazz=obj.getClass();
if (clazz.isAnnotationPresent(WorkInProgress.class)) {
System.out.println("class Annotationed WorkInProgress!");
}
Class childClass=AnnotationChildClass.class;
if (childClass.isAnnotationPresent(WorkInProgress.class)) {
System.out.println("child class Annotationed WorkInProgress!");
} } } @Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@interface WorkInProgress {} class AnnotationChildClass extends AnnotationSample{ }

JAVA进阶-注解的更多相关文章

  1. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...

  2. Java线程间通信方式剖析——Java进阶(四)

    原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...

  3. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  4. 当我们说线程安全时,到底在说什么——Java进阶系列(二)

    原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...

  5. 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)

    本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...

  6. Java进阶(七)正确理解Thread Local的原理与适用场景

    原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...

  7. Java进阶

    Java进阶(一)Annotation(注解) Java进阶(二)当我们说线程安全时,到底在说什么 Java进阶(三)多线程开发关键技术 Java进阶(四)线程间通信方式对比 Java进阶(五)NIO ...

  8. Java进阶教程:使用Lombok提升开发效率

    Java进阶教程:使用Lombok提升开发效率 Lombok Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这 ...

  9. java进阶视频分享

    更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...

随机推荐

  1. 学习swift语言的快速入门教程推荐

    随着苹果产品越来越火爆,苹果新推出的swift必定将在很大程度上代替oc语言.学好swift语言,对于IOS工程师来讲,已经是一门必备技能. 有一些比较好的英文版教程,值得学习. 1. Swift T ...

  2. [Ext JS 4] 实战Chart 协调控制(单一的坐标,两个坐标)

    前言

  3. HDU 1710-Binary Tree Traversals(二进制重建)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  4. ContentMode 几个属性

    版权声明:本文博客原创文章,博客,未经同意,不得转载.

  5. [SignalR]Groups操作

    原文:[SignalR]Groups操作 SignalR提供了Groups进行小范围的消息广播.可以通过Add和Remove两个方法进行群组成员操作.并不需要创建Groups,在Add的时候会自动创建 ...

  6. 安卓模拟器错误: Could not open

    在进行android模拟器測试的时候,出现下面错误,进度条满了之后就没反应了.图例如以下: 引起这个问题的可能原因有非常多: 原因一:由于我们採用的是绝对路径定位.也就是说在环境变量里面把路径写死了, ...

  7. k8s with flanneld

    三台机器 kmaster 192.168.1.201 kslave202 192.168.1.202 kslave203 192.168.1.203 安装好k8s 1. 在Node机器上安装flann ...

  8. PHP微信SDK——Zebra-Wechat

    Zebra-Wechat 微信SDK 眼下处于开发状态,眼下实现了下面功能: 接收微信server推送信息,对推送信息类型进行识别 微信APIclient封装(用户管理.用户组管理.客服管理.自己定义 ...

  9. 在WIN7笔记本电脑系统的建立WIFI热点

        成功的关键是,你在运行秩序:       前置条件:右键"我的电脑"--"属性"--"设备管理器"--"网络适配器&quo ...

  10. C#管理控制IIS7的方法

    原文:C#管理控制IIS7的方法 转自 http://www.lob.cn/jq/csyy/7285.shtml 把在找到正确方法前遇到的挫折也拿出来与大家分享,相信不少朋友从iis6到iis7的过渡 ...