JAVA进阶-Annotation

注解元数据分为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{

}
时间: 2024-08-23 14:54:30

JAVA进阶-Annotation的相关文章

转:java 进阶之路

转: https://www.zhihu.com/question/39139518 一.基础篇1.1 JVM1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 Java内存模型 1.1.2. 了解JVM各种参数及调优1.1.3. 学习使用Java工具 jps, jstack, jmap, jconsole, jinfo, jhat, javap, … BTrace — Project Ken

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

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/java/multi_thread/ sleep和wait到底什么区别 其实这个问题应该这么问--sleep和wait有什么相同点.因为这两个方法除了都能让当前线程暂停执行完,几乎没有其它相同点. wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法.sleep方法是Thread类的静态方法. wait是在当前线程持有wait对象锁

Java进阶书籍推荐

学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言.废话不多说,下边就给广大程序猿们推荐一些Java进阶的好书. 第一部分:Java语言篇 1.<Java编程规范> 适合对象:初级.中级 介绍:这本书的作者是被誉为Java之父的James Gosling,入门者推荐阅读,对基础的讲解很不错. 2.<Java编程思想> 适合对象:初级.中级 介绍:豆瓣给出了9.1的评分,全球程序员广泛赞誉.有人说这本书不适合初学者,不过小编认为作者并没有对读者已有的知识经验有过多要求,

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package

Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空. b.JVM栈(Java Virtual Machine Stack) 描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 每一个方法从调用直至执行完成

java进阶08 GUI图形界面

图形化用户界面(GUI) 简而言之,就是可视化编程. 要想实现可视化界面(窗口),需要用到JFrame类. package Frame; public class JFrame1 { public static void main(String[] args){ UI ui=new UI(); } } 先建一个主函数,而主函数中的操作只有一句代码.这样做,既能直观又方便后期修改. 接下来是UI类的实现 package Frame; import javax.swing.JFrame; publi

java进阶07 线程的让步与阻塞与同步

前面介绍了线程的一些基本知识,现在来说下线程的让步,阻塞,和同步 先说说让步 所谓让步,就是让调用者的线程暂停,让其他线程重新竞争CPU,包括调用者. 先看看代码 package Thread; public class ThreadYield { public static void main(String[] args){ MyThread5 rthread=new MyThread5(); Thread thread1=new Thread(rthread); Thread thread2

java进阶06 线程初探

线程,程序和进程是经常容易混淆的概念. 程序:就是有序严谨的指令集 进程:是一个程序及其数据在处理机上顺序执行时所发生的活动 线程:程序中不同的执行路径,就是程序中多种处理或者方法. 线程有两种方法实现 一:继承Thread 覆盖run方法 package Thread; public class Thread1 { public static void main(String[] args){ MyThread1 thread1=new MyThread1(); thread1.setName

高级java进阶之类的卸载

首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域 方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息.常量.静态变量以及方法代码的内存区域,叫做方法区. 常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息. 堆区:用于存放类的对象实例. 栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量.方法出口等信息.当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果