注解元数据分为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. mouseover与mouseenter与mousemove差额mouseout与mouseleave差额

    <1> HTML <html> <head> <title></title> </head> <body> < ...

  2. Flynn初步:基于Docker的PaaS台

    Flynn它是一个开源PaaS台,无论要部署的应用程序,你可以建立自己的主动性Docker容器集群的实现,能特性与组件设计大量參考了传统的PaaS平台Heroku.本文旨在从使用动机.基本对象.层次架 ...

  3. 初学者应学会如何加快seo

    新手学习如何加快seo 介绍: 应该如何初学者学习SEO,前弯路.真正的高手SEO知识. 作为一个新人,学习如何加快seo知识吧?        多人天天都在学习seo知识.看别人的文章.看多了就感觉 ...

  4. UVA 239 - Tempus et mobilius. Time and motion(更换周期)

    UVA 239 - Tempus et mobilius. Time and motion 题目链接 题意:这题题意也是吊得飞起,看了老半天,大概是这样: 有一个放球的队列.和3个轨道(说白了就是栈) ...

  5. 【cocos2d-js公文】十八、Cocos2d-JS v3.0物业风格API

    1. 新的API风格 我们直接来看看你能够怎样使用Cocos2d-JS v3.0: 曾经的API 新的API node.setPosition(x, y); node.x = x; node.y = ...

  6. web架构设计经验分享(转)

    本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查 ...

  7. 由于抽签HT For Web ComboBox下拉框组件

    传统HTML5的下拉框select仅仅能实现简单的文字下拉列表,而HT for Web通用组件中ComboBox不仅可以实现传统HTML5下拉框效果,并且可以在文本框和下拉列表中加入自己定义的小图标, ...

  8. 什么是WEBserver? 经常使用的WEBserver有哪些?

    什么是WEBserver? 经常使用的WEBserver有哪些? 一.什么是WEBserver Webserver能够解析HTTP协议.当Webserver接收到一个HTTP请求,会返回一个HTTP响 ...

  9. 工作介绍xml书包文件

    光开放平台一个非常重要的特点就是简化了对xml文件的操作,您能非常轻松地引入xml文件.定位到随意节点.增删属性和文本以及节点本身,以下咱们用实例来介绍对xml的操作 引入xml文件: <cht ...

  10. GitHub版本控制

    版本控制-GitHub 前面几篇文章,我们介绍了Git的基本用法及Git服务器的搭建,本篇文章来学习一下如何使用GitHub.GitHub是开源的代码库以及版本控制库,是目前使用网络上使用最为广泛的服 ...