我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > java如何自定义注解
总共48087条微博

动态微博

查看: 979|回复: 0

java如何自定义注解

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2015-06-05 17:49:29 |只看该作者 |倒序浏览
    java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
    ! r5 Q' o* }' U: f+ A% `# B( p% h注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。( U9 i" |4 i9 p5 S. n

    ! x7 m. N# z4 E( n" C1、元注解: `& f% X( q: N+ a( F
    ( [( N# y+ \* |2 h2 a
    元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种。
    ) `9 W: r4 Q( {9 o/ Q; f; y; \5 k0 I' E, h( H( z

    6 c, G& }1 R! }  H' e, K4 d1.1、@Retention: 定义注解的保留策略- G0 Z* E7 x" Z: v

    ( H: w' V; \# Z) A@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含/ Y. A- [0 M* L6 G4 C* c' I4 U
    @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,) I& f( H7 w+ H" m; K# V( j& g
    @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到* ^& S2 K/ C# }4 M
    1 c' e5 _' J7 x- W' i3 M; y) z
    1.2、@Target:定义注解的作用目标& V  D0 K6 z+ M& |
    其定义的源码为:
    1. @Documented' G; x( K; S/ |, r2 V
    2. @Retention(RetentionPolicy.RUNTIME)
      " g7 e/ X2 F) P! O
    3. @Target(ElementType.ANNOTATION_TYPE)7 o% }. y3 _% m  G
    4. public @interface Target {
      # t/ \: a, P) v5 S0 G4 @0 ?) @
    5.     ElementType[] value();
      0 B# Y$ S3 v' W
    6. }
    复制代码
    - U* J5 h: @  u
    @Target(ElementType.TYPE)   //接口、类、枚举、注解
    4 Q% j/ \  n! ~% V' Y, ~/ f2 L# M  G" ?/ k- F) E
    @Target(ElementType.FIELD) //字段、枚举的常量4 Z, R$ s% O3 W/ _7 A% p6 q2 p
    @Target(ElementType.METHOD) //方法
    9 B2 z* o9 I: p@Target(ElementType.PARAMETER) //方法参数
    1 ]# v- d' G; X% w: v5 {3 R: q- J@Target(ElementType.CONSTRUCTOR)  //构造函数& S6 ?7 m. X6 s
    @Target(ElementType.LOCAL_VARIABLE)//局部变量
    ' a' A# P- k2 E# H8 g@Target(ElementType.ANNOTATION_TYPE)//注解: A% @# f* B% q0 A9 [+ A8 A
    @Target(ElementType.PACKAGE) ///包   ) E$ x/ p0 _9 Q9 h7 ^
    由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等  g7 V/ |5 X8 F4 K6 c
    1.3、@Document:说明该注解将被包含在javadoc中; ?$ O9 T0 [! P  R+ W) ?

    $ \  ^. [! L- E/ C1 [6 f1.4、@Inherited:说明子类可以继承父类中的该注解3 ~' U: a$ K; A# |* z

    9 y: I8 [5 `0 X' R. l" \2、java 注解的自定义
    ) u; j. C) v% }1 {# m$ P8 e      下面是自定义注解的一个例子
    5 o8 e. j3 }& r0 p* v' L@Retention(RetentionPolicy.RUNTIME)
    7 y" l# b* [7 C1 s$ @' l
    0 g- I# J6 m. X# ]/ J" Q定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。, Y  x6 J& U1 S4 q: h/ U0 |. `
    $ ?, r4 z* B. B$ X# b
    @Target({ElementType.TYPE,ElementType.METHOD})
    & x8 T# @2 `. x' O1 U5 O/ l! o3 H
    因此这个注解可以是类注解,也可以是方法的注解" p. O+ Z: F& j$ M6 E0 T8 d
    ( t$ v! u1 D2 v
    这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等
    4 F5 X6 ]( Y# a0 |0 A! C
    2 s) V8 w5 p) z$ `! ?( H  d+ ?0 `$ b. k; n- o+ T4 w; v2 t2 Q- t

    3 G2 J, [6 C8 }& X3 注解是定义好了,那么怎么来得到,解析注解呢?
    2 `/ n0 s; u+ j% E% j% [
    ' p8 {. M* D9 j( a. Zjava的反射机制可以帮助,得到注解,代码如下:) Q: A: f5 S: Y( V( y2 o
    1 T  M& d" b% k3 \5 X

    8 k( _; t6 G1 C  R2 p以下是测试方法类
    # n3 W" J, z- W7 a9 J) U- c
    : l& W! e' r: a& H5 f- u! Z

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表