Java Reflection:注解

转载 2016年08月31日 15:02:39

什么是注解
类注解
方法注解
参数注解
变量注解

利用Java反射机制可以在运行期获取Java类的注解信息。

什么是注解

注解是Java 5的一个新特性。注解是插入你代码中的一种注释或者说是一种元数据(meta data)。这些注解信息可以在编译期使用预编译工具进行处理(pre-compiler tools),也可以在运行期使用Java反射机制进行处理。下面是一个类注解的例子:

1 @MyAnnotation(name="someName",  value = "Hello World")
2 public class TheClass {
3 }

在TheClass类定义的上面有一个@MyAnnotation的注解。注解的定义与接口的定义相似,下面是MyAnnotation注解的定义:

1 @Retention(RetentionPolicy.RUNTIME)
2 @Target(ElementType.TYPE)
3  
4 public @interface MyAnnotation {
5   public String name();
6   public String value();
7 }

在interface前面的@符号表名这是一个注解,一旦你定义了一个注解之后你就可以将其应用到你的代码中,就像之前我们的那个例子那样。
在注解定义中的两个指示@Retention(RetentionPolicy.RUNTIME)和@Target(ElementType.TYPE),说明了这个注解该如何使用。
@Retention(RetentionPolicy.RUNTIME)表示这个注解可以在运行期通过反射访问。如果你没有在注解定义的时候使用这个指示那么这个注解的信息不会保留到运行期,这样反射就无法获取它的信息。
@Target(ElementType.TYPE) 表示这个注解只能用在类型上面(比如类跟接口)。你同样可以把Type改为Field或者Method,或者你可以不用这个指示,这样的话你的注解在类,方法和变量上就都可以使用了。
关于Java注解更详细的讲解可以访问Java Annotations tutorial

类注解

你可以在运行期访问类,方法或者变量的注解信息,下是一个访问类注解的例子:

01 Class aClass = TheClass.class;
02 Annotation[] annotations = aClass.getAnnotations();
03  
04 for(Annotation annotation : annotations){
05     if(annotation instanceof MyAnnotation){
06         MyAnnotation myAnnotation = (MyAnnotation) annotation;
07         System.out.println("name: " + myAnnotation.name());
08         System.out.println("value: " + myAnnotation.value());
09     }
10 }

你还可以像下面这样指定访问一个类的注解:

1 Class aClass = TheClass.class;
2 Annotation annotation = aClass.getAnnotation(MyAnnotation.class);
3  
4 if(annotation instanceof MyAnnotation){
5     MyAnnotation myAnnotation = (MyAnnotation) annotation;
6     System.out.println("name: " + myAnnotation.name());
7     System.out.println("value: " + myAnnotation.value());
8 }

方法注解

下面是一个方法注解的例子:

1 public class TheClass {
2   @MyAnnotation(name="someName",  value = "Hello World")
3   public void doSomething(){}
4 }

你可以像这样访问方法注解:

01 Method method = ... //获取方法对象
02 Annotation[] annotations = method.getDeclaredAnnotations();
03  
04 for(Annotation annotation : annotations){
05     if(annotation instanceof MyAnnotation){
06         MyAnnotation myAnnotation = (MyAnnotation) annotation;
07         System.out.println("name: " + myAnnotation.name());
08         System.out.println("value: " + myAnnotation.value());
09     }
10 }

你可以像这样访问指定的方法注解:

1 Method method = ... // 获取方法对象
2 Annotation annotation = method.getAnnotation(MyAnnotation.class);
3  
4 if(annotation instanceof MyAnnotation){
5     MyAnnotation myAnnotation = (MyAnnotation) annotation;
6     System.out.println("name: " + myAnnotation.name());
7     System.out.println("value: " + myAnnotation.value());
8 }

参数注解

方法参数也可以添加注解,就像下面这样:

1 public class TheClass {
2   public static void doSomethingElse(
3         @MyAnnotation(name="aName", value="aValue") String parameter){
4   }
5 }

你可以通过Method对象来访问方法参数注解:

01 Method method = ... //获取方法对象
02 Annotation[][] parameterAnnotations = method.getParameterAnnotations();
03 Class[] parameterTypes = method.getParameterTypes();
04  
05 int i=0;
06 for(Annotation[] annotations : parameterAnnotations){
07   Class parameterType = parameterTypes[i++];
08  
09   for(Annotation annotation : annotations){
10     if(annotation instanceof MyAnnotation){
11         MyAnnotation myAnnotation = (MyAnnotation) annotation;
12         System.out.println("param: " + parameterType.getName());
13         System.out.println("name : " + myAnnotation.name());
14         System.out.println("value: " + myAnnotation.value());
15     }
16   }
17 }

需要注意的是Method.getParameterAnnotations()方法返回一个注解类型的二维数组,每一个方法的参数包含一个注解数组。

变量注解

下面是一个变量注解的例子:

1 public class TheClass {
2  
3   @MyAnnotation(name="someName",  value = "Hello World")
4   public String myField = null;
5 }

你可以像这样来访问变量的注解:

01 Field field = ... //获取方法对象</pre>
02 <pre>Annotation[] annotations = field.getDeclaredAnnotations();
03  
04 for(Annotation annotation : annotations){
05  if(annotation instanceof MyAnnotation){
06  MyAnnotation myAnnotation = (MyAnnotation) annotation;
07  System.out.println("name: " + myAnnotation.name());
08  System.out.println("value: " + myAnnotation.value());
09  }
10 }

你可以像这样访问指定的变量注解:

1 Field field = ...//获取方法对象</pre>
2 <pre>
3 Annotation annotation = field.getAnnotation(MyAnnotation.class);
4  
5 if(annotation instanceof MyAnnotation){
6  MyAnnotation myAnnotation = (MyAnnotation) annotation;
7  System.out.println("name: " + myAnnotation.name());
8  System.out.println("value: " + myAnnotation.value());

相关文章推荐

Java Reflection(八):注解

利用Java反射机制可以在运行期获取Java类的注解信息。什么是注解注解是Java 5的一个新特性。注解是插入你代码中的一种注释或者说是一种元数据(meta data)。这些注解信息可以在编译期使用预...

Java Reflection(八):注解

原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gmail.com)内容索引 什么是注解 类注解 方法注解 参数注解 变量注解利用Java反射机制可以在运行期获取...

Manning - java reflection in action(2005)

  • 2006年02月23日 15:31
  • 1.24MB
  • 下载

manning-java-reflection-in-action

  • 2007年01月30日 15:34
  • 1.71MB
  • 下载

公共技术点之 Java反射 Reflection

公共技术之 Java反射 Reflection1. 了解Java中的反射1.1 什么是Java的反射Java反射是可以让我们在运行时获取类的函数、字段、父类、接口等Class内部信息的机制。通过反射还...

Java Reflection in Action

  • 2012年05月19日 07:16
  • 1.58MB
  • 下载

Java反射机制(Reflection )

在说反射之前,让我们先来想一下这个问题:我们是否能调用某个类的私有方法或者私有成员变量呢??? 我相信很多童鞋都会说:不能! 回答“不能”的童鞋,相信理由大家都懂,针对private的成员变量...

JAVA REFLECTION IN ACTION

  • 2007年11月26日 14:00
  • 1.59MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Reflection:注解
举报原因:
原因补充:

(最多只允许输入30个字)