java反射 注解_【转】java反射--注解

=====================================================================================

使用Java反射机制,在运行时你可以访问到Java类中所附属的一些注解。下面是本文所涵盖的主题列表:

What are Java Annotations? (什么是Java注解)

Class Annotations (类注解)

Method Annotations (方法注解)

Parameter Annotations (参数注解)

Field Annotations (字段注解)

=====================================================================================

What are Java Annotations?

注解是Java 5的一个新特性。注解是一种可以写到代码中的注释或者元数据。这些注解可以在编译时由预编译工具进行处理,或者在运行时通过Java反射处理。下面是一个类注解的例子:

@MyAnnotation(name="someName", value = "Hello World")

public class TheClass {

}

类TheClass有一个注解@MyAnnotation。定义注解就和定义接口一样。下面是一个定义注解MyAnnotation的例子:

fad8b7d25106121e691838af3cc39132.gif

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

public @interface MyAnnotation {

public String name();

public String value();

}

f664ae1cb15d665125f2f0f5ab195483.gif

在interface之前加一个@符号来表示它是一个注解。一旦你定义了一个注解之后,你可以在代码中用它,和之前的例子一样。

在注解的定义中,@Retention(RetentionPolicy.RUNTIME)和@Target(ElementType.TYPE)这两个注解指定了如何去使用它们。

@Retention(RetentionPolicy.RUNTIME)表示该注解可以在运行时通过Java反射访问。如果你没有设置该指令,该注解在运行时就不会被保存,那么也就不能通过Java反射来使用。

@Target(ElementType.TYPE)表示该注解只能被用于类型上(如类、接口)。你也可以指定METHOD或者FIELD,或者你也可以省略不写,即该注解可以被用在类、方法和字段上。

关于Java注解更详细的介绍在Java Annotation tutorial中。

=====================================================================================

Class Annotations

你可以在运行时访问类、方法或字段的注解。下面是一个访问类注解的例子:

99b43faff37fcc11c23366aff487d66e.gif

Class aClass = TheClass.class;

Annotation[] annotations = aClass.getAnnotations();

for(Annotation annotation : annotations){

if(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation = (MyAnnotation) annotation;

System.out.println("name: " + myAnnotation.name());

System.out.println("value: " + myAnnotation.value());

}

}

a8a7534602056fcd4e05f91b2b2bdc0d.gif

你可以像这样访问一个给定类的注解:

53b7d7b93414f301a7d4e5b2351c4366.gif

Class aClass = TheClass.class;

Annotation annotation = aClass.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation = (MyAnnotation) annotation;

System.out.println("name: " + myAnnotation.name());

System.out.println("value: " + myAnnotation.value());

}

61e2d2d37adfb62e931be3cee43c8182.gif

=====================================================================================

Method Annotations

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

public class TheClass {

@MyAnnotation(name="someName", value = "Hello World")

public void doSomething(){}

}

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

ab54650b0ce8af411bce94ce6b907491.gif

Method method = ... //obtain method object

Annotation[] annotations = method.getDeclaredAnnotations();

for(Annotation annotation : annotations){

if(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation = (MyAnnotation) annotation;

System.out.println("name: " + myAnnotation.name());

System.out.println("value: " + myAnnotation.value());

}

}

48b99aed776dd3bd740ebaf2999fe863.gif

你也可以像这样访问一个给定方法的注解:

0a32d11beefe5bfc177672aa0c3e1b4d.gif

Method method = ... // obtain method object

Annotation annotation = method.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation = (MyAnnotation) annotation;

System.out.println("name: " + myAnnotation.name());

System.out.println("value: " + myAnnotation.value());

}

9a6eb5cd2c978d6cd67149eecdd58c93.gif

=====================================================================================

Parameter Annotations

也可以在方法参数的声明上添加注解。下面是一个例子:

public class TheClass {

public static void doSomethingElse(

@MyAnnotation(name="aName", value="aValue") String parameter){

}

}

你可以像这样访问一个Method对象的参数注解:

753eeccf11f2a7e07200dc1a14df4965.gif

Method method = ... //obtain method object

Annotation[][] parameterAnnotations = method.getParameterAnnotations();

Class[] parameterTypes = method.getParameterTypes();

int i=0;

for(Annotation[] annotations : parameterAnnotations){

Class parameterType = parameterTypes[i++];

for(Annotation annotation : annotations){

if(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation = (MyAnnotation) annotation;

System.out.println("param: " + parameterType.getName());

System.out.println("name : " + myAnnotation.name());

System.out.println("value: " + myAnnotation.value());

}

}

}

11387ae4b1a5795bb630f931ce8d7633.gif

注意Method.getparameterAnnotations()方法如何返回一个二维的Annotation数组,该数组中包含每一个方法的参数注解。

=====================================================================================

Field Annotations

下面是一个字段注解的例子:

public class TheClass {

@MyAnnotation(name="someName", value = "Hello World")

public String myField = null;

}

你可以像这样访问字段的注解:

0a4f325e06592c29fd7ee0855369d76f.gif

Field field = ... //obtain field object

Annotation[] annotations = field.getDeclaredAnnotations();

for(Annotation annotation : annotations){

if(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation = (MyAnnotation) annotation;

System.out.println("name: " + myAnnotation.name());

System.out.println("value: " + myAnnotation.value());

}

}

b5754e0a45ca5bcbf8bb70dde02db075.gif

你也可以这样访问一个给定字段的注解:

ce20a28276a16625c78f2ebb35930a87.gif

Field field = ... // obtain method object

Annotation annotation = field.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation = (MyAnnotation) annotation;

System.out.println("name: " + myAnnotation.name());

System.out.println("value: " + myAnnotation.value());

}

e0d8f88f21ab69543e92102078bfb8b2.gif

========================================================================================

目录

这是一个本教程到目前为止涵盖的主题列表:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值