JAVA进阶-注解
注解元数据分为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进阶-注解的更多相关文章
- Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/java/nio_reactor/ Java I/O模型 同步 vs. 异步 同步I/O 每个请求必须逐个地被处理,一个请 ...
- Java线程间通信方式剖析——Java进阶(四)
原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)
本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...
- Java进阶(七)正确理解Thread Local的原理与适用场景
原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...
- Java进阶
Java进阶(一)Annotation(注解) Java进阶(二)当我们说线程安全时,到底在说什么 Java进阶(三)多线程开发关键技术 Java进阶(四)线程间通信方式对比 Java进阶(五)NIO ...
- Java进阶教程:使用Lombok提升开发效率
Java进阶教程:使用Lombok提升开发效率 Lombok Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这 ...
- java进阶视频分享
更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...
随机推荐
- mouseover与mouseenter与mousemove差额mouseout与mouseleave差额
<1> HTML <html> <head> <title></title> </head> <body> < ...
- Flynn初步:基于Docker的PaaS台
Flynn它是一个开源PaaS台,无论要部署的应用程序,你可以建立自己的主动性Docker容器集群的实现,能特性与组件设计大量參考了传统的PaaS平台Heroku.本文旨在从使用动机.基本对象.层次架 ...
- 初学者应学会如何加快seo
新手学习如何加快seo 介绍: 应该如何初学者学习SEO,前弯路.真正的高手SEO知识. 作为一个新人,学习如何加快seo知识吧? 多人天天都在学习seo知识.看别人的文章.看多了就感觉 ...
- UVA 239 - Tempus et mobilius. Time and motion(更换周期)
UVA 239 - Tempus et mobilius. Time and motion 题目链接 题意:这题题意也是吊得飞起,看了老半天,大概是这样: 有一个放球的队列.和3个轨道(说白了就是栈) ...
- 【cocos2d-js公文】十八、Cocos2d-JS v3.0物业风格API
1. 新的API风格 我们直接来看看你能够怎样使用Cocos2d-JS v3.0: 曾经的API 新的API node.setPosition(x, y); node.x = x; node.y = ...
- web架构设计经验分享(转)
本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查 ...
- 由于抽签HT For Web ComboBox下拉框组件
传统HTML5的下拉框select仅仅能实现简单的文字下拉列表,而HT for Web通用组件中ComboBox不仅可以实现传统HTML5下拉框效果,并且可以在文本框和下拉列表中加入自己定义的小图标, ...
- 什么是WEBserver? 经常使用的WEBserver有哪些?
什么是WEBserver? 经常使用的WEBserver有哪些? 一.什么是WEBserver Webserver能够解析HTTP协议.当Webserver接收到一个HTTP请求,会返回一个HTTP响 ...
- 工作介绍xml书包文件
光开放平台一个非常重要的特点就是简化了对xml文件的操作,您能非常轻松地引入xml文件.定位到随意节点.增删属性和文本以及节点本身,以下咱们用实例来介绍对xml的操作 引入xml文件: <cht ...
- GitHub版本控制
版本控制-GitHub 前面几篇文章,我们介绍了Git的基本用法及Git服务器的搭建,本篇文章来学习一下如何使用GitHub.GitHub是开源的代码库以及版本控制库,是目前使用网络上使用最为广泛的服 ...