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{

}
时间: 2024-10-11 09:45:11

JAVA进阶-注解的相关文章

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 Annotation(注解)的数据校验框架

JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方便和重用,自己写了一个简单的基于Annotation的校验框架.有兴趣的可以扩展. 框架说明: AnnotationValidable接口:所有需要使用该校验框架的类都要实现它,该类中没有任何方法需要实现,仅仅是一个表明那些类需要使用该校验框架的标识. GetFiledValue类:是一个工具类,对

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:注解(Annotation)--注解处理器

深入理解Java:注解(Annotation)--注解处理器 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器. 注解处理器类库(java.lang.reflect.AnnotatedElement): Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口.除此之外,Java在java.l