今天在做一个工具,我把注解放在属性上,通过反射怎么也取不到。
1、可能是定义的注解的@Target没有配置作用在属性上。
2、还有可能是你定义的属性是private的,但是你用的Class.getFields(),这个方法不能获取private的属性,应该采用Class.getDeclaredFields()。
参考:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html
上面的这篇文章就是深入讲解的注解。
一、注解介绍
在JDK5.0引入了“注解”的概念。那为什么要引入注解呢?它有什么好处呢?
举个例子:
这个注解就是代表下面的方法是重写父类的方法,(注意:把@Override注解去掉,也是好使的,那为什么还要加上呢?),加上的话,一旦我们把这个方法写错了的话(void toString()…)等,会报错的,也就是去掉的,一旦写错的话,会出现两种结果。
下面讲解“元注解”,因为我们后面讲到的自定义注解在在这些元注解之上,也就是我们的自定义注解上应该配置这些注解。
二、元注解
1) @Retention (代表该注解的生命周期)
在包java.lang.annotation中,有java的元注解,还有一些注解的接口。
@Retention的源码:
从上面的源码可以看出:
(a) 注解可以相互修饰。
(b) 在@Retention中只有一个字段(属性)。类型为RetentionPolicy(枚举),属性名为value,括号就是注解中的一种语法格式。
2) @Target (代表该注解作用的范围)
@Target的源码:
从上图可以看出:
@Target成员属性的类型是ElementType(枚举)数组,属性名为value。
ElementType枚举类型的源码:
3)@Document (代表使用javadoc工具打包文档的时候会把注解打包进去)
@Documented源码如下:
4) @Inherited (代表加上这个注解的类会继承它的父类的注解)
@Inheriter源码如下:
三、自定义注解
第一步:定义注解
1、普通注解
注意:可以在属性在后面加上 : String name() default "jack";
2、抽象属性
注意:定义的注解中的属性可以抽象的,这样的话,配置这个注解必须要配置下面的属性。
3、注意
1、上面定义的注解上配置了Retention,加上了运行时可以用,也就是支持反射。
2、配置Target,看配置可以支持类、属性、构造、方法,也就是这个demo的注解配置配置在这些方面,加上上面的Retention配置,也就是这这些地方可以支持反射。
3、另外还有一点是注解特有的,注解可以支持传递,也就是@demo注解配置了上面的属性,假设现在定义一个注解@haha,在@haha上配置了@demo注解,也就是@haha上相当于配置了Retention与Target上面的属性。
例如:
@demo
public @interface haha{
}
第二部:在某个类(或其它地方)使用自定义注解:
注解在别处的代码:
第三步:通过反射获取注解
注解方式的开发其实现在在好多系统中都使用到了,它方便开发框架或者一种插件式的系统。一般要结合反射知识使用。