Java注解详解

今天在做一个工具,我把注解放在属性上,通过反射怎么也取不到。

    1、可能是定义的注解的@Target没有配置作用在属性上。

    2、还有可能是你定义的属性是private的,但是你用的Class.getFields(),这个方法不能获取private的属性,应该采用Class.getDeclaredFields()。

 

参考:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html

上面的这篇文章就是深入讲解的注解。

 

一、注解介绍

        在JDK5.0引入了“注解”的概念。那为什么要引入注解呢?它有什么好处呢?

举个例子:

100905_Fxbj_3648248.png

        这个注解就是代表下面的方法是重写父类的方法,(注意:把@Override注解去掉,也是好使的,那为什么还要加上呢?),加上的话,一旦我们把这个方法写错了的话(void toString()…)等,会报错的,也就是去掉的,一旦写错的话,会出现两种结果。

 

    下面讲解“元注解”,因为我们后面讲到的自定义注解在在这些元注解之上,也就是我们的自定义注解上应该配置这些注解。

 

二、元注解

1) @Retention (代表该注解的生命周期)

在包java.lang.annotation中,有java的元注解,还有一些注解的接口。

 

@Retention的源码:

101019_1766_3648248.png

从上面的源码可以看出:

(a)     注解可以相互修饰。

(b)     在@Retention中只有一个字段(属性)。类型为RetentionPolicy(枚举),属性名为value,括号就是注解中的一种语法格式。

101111_If63_3648248.png

 

2) @Target (代表该注解作用的范围)

@Target的源码:

 101244_lXvk_3648248.png

 

从上图可以看出:

         @Target成员属性的类型是ElementType(枚举)数组,属性名为value。

 

ElementType枚举类型的源码:

101307_nNHG_3648248.png

 

3)@Document (代表使用javadoc工具打包文档的时候会把注解打包进去)

 

@Documented源码如下:

101326_NZjj_3648248.png

 

4) @Inherited (代表加上这个注解的类会继承它的父类的注解)

 

@Inheriter源码如下:

101346_JitM_3648248.png

 

三、自定义注解

第一步:定义注解

1、普通注解

101419_1aVD_3648248.png

 

注意:可以在属性在后面加上 : String name() default "jack";

 

2、抽象属性

注意:定义的注解中的属性可以抽象的,这样的话,配置这个注解必须要配置下面的属性。

103827_lkNV_3648248.png

3、注意

    1、上面定义的注解上配置了Retention,加上了运行时可以用,也就是支持反射。

    2、配置Target,看配置可以支持类、属性、构造、方法,也就是这个demo的注解配置配置在这些方面,加上上面的Retention配置,也就是这这些地方可以支持反射。

    3、另外还有一点是注解特有的,注解可以支持传递,也就是@demo注解配置了上面的属性,假设现在定义一个注解@haha,在@haha上配置了@demo注解,也就是@haha上相当于配置了Retention与Target上面的属性。

例如:

    @demo

    public @interface haha{

    }

 

第二部:在某个类(或其它地方)使用自定义注解:

101454_p1kL_3648248.png

 

注解在别处的代码:

101515_iZ4b_3648248.png

 

第三步:通过反射获取注解

101530_a3M8_3648248.png

 

        注解方式的开发其实现在在好多系统中都使用到了,它方便开发框架或者一种插件式的系统。一般要结合反射知识使用。

 

转载于:https://my.oschina.net/u/3648248/blog/1526735

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值