Java Annotation详解

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

下面我们来修改Greeting注释,为之添加限定范围的语句,这里我们称它为目标(Target)使用方法也很简单,如下:

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

public @interface Greeting {

}

正如上面代码所展示的,我们只允许Greeting注释标注在普通方法和构造函数上,使用在包申明、类名等时,会提示错误信息。

注释保持性策略

public enum RetentionPolicy {

SOURCE,// Annotation is discarded by the compiler

CLASS,// Annotation is stored in the class file, but ignored by the VM

RUNTIME// Annotation is stored in the class file and read by the VM

}

RetentionPolicy的使用方法与ElementType类似,简单代码示例如下:

@Retention(RetentionPolicy.RUNTIME)

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

文档化功能

Java提供的Documented元注释跟Javadoc的作用是差不多的,其实它存在的好处是开发人员可以定制Javadoc不支持的文档属性,并在开发中应用。它的使用跟前两个也是一样的,简单代码示例如下:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

public @interface Greeting {

}

值得大家注意的是,如果你要使用@Documented元注释,你就得为该注释设置RetentionPolicy.RUNTIME保持性策略。为什么这样做,应该比较容易理解,这里就不提了。

标注继承

继承应该是Java提供的最复杂的一个元注释了,它的作用是控制注释是否会影响到子类,简单代码示例如下:

@Inherited

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target( { ElementType.METHOD, ElementType.CONSTRUCTOR })

public @interface Greeting {

}

读取注释信息

当我们想读取某个注释信息时,我们是在运行时通过反射来实现的,如果你对元注释还有点印象,那你应该记得我们需要将保持性策略设置为RUNTIME,也就是说只有注释标记了@Retention(RetentionPolicy.RUNTIME)的,我们才能通过反射来获得相关信息,下面的例子我们将沿用前面几篇文章中出现的代码,并实现读取AnnotationTest类所有方法标记的注释并打印到控制台。好了,我们来看看是如何实现的吧:

public class AnnotationIntro {

public static void main(String[] args) throws Exception {

Method[] methods = Class.forName(

“com.gelc.annotation.demo.customize.AnnotationTest”)

.getDeclaredMethods();

Annotation[] annotations;

for (Method method : methods) {

annotations = method.getAnnotations();

for (Annotation annotation : annotations) {

System.out.println(method.getName() + ” : “

+ annotation.annotationType()。getName());

}

Java并发编程中,用到了一些专门为并发编程准备的 Annotation。

主要包括三类:

1、类 Annotation(注解)

就像名字一样,这些注解是针对类的。主有要以下三个:

@Immutable

@ThreadSafe

@NotThreadSafe

@ThreadSafe 是表示这个类是线程安全的。具体是否真安全

@Immutable 表示,类是不可变的,包含了 @ThreadSafe 的意思。

@NotThreadSafe 表示这个类不是线程安全的。如果是线程安全的非要打上这个注解,那也不会报错。

这三个注解,对用户和维护者是有益的,用户可以立即看出来这个类是否是线程安全的,维护者则是可以根据这个注解,重点检查线程安全方面。另外,代码分析工具可能会利用这个注解。

2、域 Annotation(注解)

域注解是对类里面成员变量加的注解。

3、方法 Annotation(注解)

方法注解是对类里面方法加的注解。

域注解和方法注解都是用@GuardedBy( lock )来标识。里面的Lock是告诉维护者:这个状态变量,这个方法被哪个锁保护着。这样可以强烈的提示类的维护者注意这里。

@GuardedBy( lock )有以下几种使用形式:

1、@GuardedBy( “this” ) 受对象内部锁保护

2、@GuardedBy( “fieldName” ) 受 与fieldName引用相关联的锁 保护。

3、@GuardedBy( “ClassName.fieldName” ) 受 一个类的静态field的锁 保存。

4、@GuardedBy( “methodName()” ) 锁对象是 methodName() 方法的返值,受这个锁保护。

5、@GuardedBy( “ClassName.class” ) 受 ClassName类的直接锁对象保护。而不是这个类的某个实例的锁对象。

[1][2]

既有美妙的风景,也会有称不上景只有风的地方。

Java Annotation详解

相关文章:

你感兴趣的文章:

标签云: