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动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言?一、动态语言动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的...
  • xu__cg
  • xu__cg
  • 2016年10月20日 22:00
  • 2441

28、Java反射(reflection)机制(很重要)

Java语言的反射机制 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的...
  • kaoa000
  • kaoa000
  • 2013年01月04日 21:32
  • 13418

Java Reflection(八):注解

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

Java学习笔记之反射(Reflection)

什么是反射能够分析类能力的程序称为反射(reflection)反射可以用来干什么Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的...
  • GongchuangSu
  • GongchuangSu
  • 2016年07月21日 10:56
  • 1344

java的反射机制Reflection(重点、难点)

1、在集合中必须使用泛型;
  • lpp1234567
  • lpp1234567
  • 2014年03月10日 16:59
  • 718

Java中反射机制(Reflection)学习

Java语言的反射机制初步学习 首先看下基本概念:   (一)在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任 意一个方法?答案是肯定的。这...
  • u013322876
  • u013322876
  • 2016年01月26日 16:59
  • 229

java反射Reflection(一)之的类加载器ClassLoader和Class类

反射就是把Java的各种成分映射成相应的Java类。      反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的...
  • u014659656
  • u014659656
  • 2015年03月23日 21:49
  • 738

疯狂java讲义之类加载与反射

1. 类的加载, 连接和初始化     1.1 JVM和类      当我们调用java命令运行某个java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序多复杂、启动了多少个线程,它...
  • u010098159
  • u010098159
  • 2015年07月09日 13:47
  • 276

Unity3D Shader之光照模型——理论与实践:用两种方式来实现漫反射Diffuse Reflection

漫反射原理解析众所周知,漫反射即光线射到粗糙的物体表面时发生的反射现象,入射光线为平行光线,而出射光线为各个方向。光在空气中以直线传播,光线的反射也遵守物理规则。...
  • kevlis
  • kevlis
  • 2016年11月03日 16:07
  • 480

反射矩阵(reflection matrix)推导

1. 了解    平面方程(Plane Equation)  : http://www.cnblogs.com/kesalin/archive/2009/09/09/plane_equa...
  • aa20274270
  • aa20274270
  • 2016年08月02日 18:39
  • 1173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Reflection:注解
举报原因:
原因补充:

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