我的日常

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

动态微博

查看: 1496|回复: 3

java自定义标注实例

[复制链接]

2

主题

0

听众

362

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-11-18 22:20:38 |只看该作者 |倒序浏览
在这篇教程中,我们将示范如何新建两个自定义的标注: @Test和@TestInfo,并模拟一个简单的单元测试框架。

[size=13.043478965759277px]这个@interface标识java程序,这是一份自定义标注。之后,你可以在方法级别上标注它就像这样@Test(enable=false)

[size=13.043478965759277px]Test.java

  1. package com.mkyong.test.core;
    3 A0 q) p( {9 H1 \8 _" _+ Q; H

  2. % s6 K6 D7 q- B) @2 x/ \7 Y
  3. import java.lang.annotation.ElementType;
    9 H% @4 D4 Z  _% [. M! @
  4. import java.lang.annotation.Retention;* R, C/ g1 Q  x6 Y) }
  5. import java.lang.annotation.RetentionPolicy;
    * w6 V6 ?* F4 L& ~- L8 H% a
  6. import java.lang.annotation.Target;
    , ~) t* X6 x% d; A

  7. . W+ j( a% f$ ^" E5 H8 [
  8. @Retention(RetentionPolicy.RUNTIME)
    5 M$ z) u5 c/ |% g
  9. @Target(ElementType.METHOD) //can use in method only.$ {8 Z. n4 s2 a+ t8 D. I
  10. public @interface Test {0 }& C: V( u3 M3 m0 O8 k

  11. 0 r: A; w" N' N. b0 ^4 Z5 e
  12.         //should ignore this test?
    9 N* Y+ F# @/ k$ F9 E
  13.         public boolean enabled() default true;
    1 {# I8 J6 w$ W1 ]9 X, \

  14. 4 Y& V. N  W; T- O' [% Y/ i) D, J9 _
  15. }</font></font>
复制代码
注意
. ^2 T. F. Z! N方法申明必须不能带有任何参数或throws片段,返回类型限制为基本类型,字符串String,类Class,枚举eunms,标注和这些类型的数组1 q' f# }0 u" R8 y6 y" ]) u& L* y
* m' A# g/ E) T0 T7 @2 @" F4 b& W
2. @TesterInfo Annotation, @# B9 v  C- `; Q
@TesterInfo应用到类级别,保存tester的详情。这个类演示返回不同的类型:enum, array and string
# t* d/ [' m8 l0 T& KTesterInfo.java
& k6 D" E  M! y
% N6 j( q9 f) m2 U& _4 |
  1. package com.mkyong.test.core;+ F7 t" C, w/ x3 w% w5 |
  2. ! S, P* u. d* s9 ~
  3. import java.lang.annotation.ElementType;
    " l: h- B* h2 q% R0 H0 X- n
  4. import java.lang.annotation.Retention;
    0 _: a. b! w* u3 z3 p
  5. import java.lang.annotation.RetentionPolicy;. x. K; j+ C  B! g
  6. import java.lang.annotation.Target;1 O; e- m5 o. `( ]* X: D
  7. $ S0 R  N( R2 Y7 _% C
  8. @Retention(RetentionPolicy.RUNTIME)
    4 b' j* s* A8 B2 |
  9. @Target(ElementType.TYPE) //on class level
    & X  b! t' j4 e1 ^1 j% s/ ]
  10. public @interface TesterInfo {
    7 g  m+ a( }& R* p

  11. + `# A+ ]* E, B" l" s4 o+ h
  12.         public enum Priority {
    2 M* Y& p* T! p7 s
  13.            LOW, MEDIUM, HIGH/ T: r. E) J* A" A
  14.         }; u5 A8 v7 y: q- S! C& A

  15. ) l+ m" ^: A3 t. T8 F1 T
  16.         Priority priority() default Priority.MEDIUM;
    0 _  B7 A. m/ m- w' e# M9 |- \$ \- g
  17. : K& ~- L, i3 Z( ~) u
  18.         String[] tags() default "";0 _# `: o8 B; Z$ g- D% q$ P+ o
  19. : u5 k/ u6 {8 D3 ]' G. C; q
  20.         String createdBy() default "Mkyong";
    / [% z9 D$ z6 [1 Q
  21. ( r; t0 o) n5 b  M
  22.         String lastModified() default "03/01/2014";/ |' n/ n" R5 H9 [& v2 U% p

  23. 9 T6 p/ r* z4 W/ e: E, z
  24. }
复制代码

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


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

2

主题

0

听众

362

金钱

三袋弟子

该用户从未签到

沙发
发表于 2014-11-18 22:25:14 |只看该作者
3. Unit Test Example
/ Z8 S" }4 V2 ]3 Y) ?7 T0 I新建一个简单的单元测试实例,并且通过新建的标注来标注:@Test and @TesterInfo  m1 l7 G. a( a  \  w

0 ^/ m! q0 P* r+ |; f& wTestExample.java
  1. package com.mkyong.test;
    + T! O' G. H7 u# }8 U
  2. / O- g$ O) v3 G& e
  3. import com.mkyong.test.core.Test;
    6 p5 s; L4 j! d9 P9 E0 X: N
  4. import com.mkyong.test.core.TesterInfo;' @  e. D- a0 }' X4 C. u
  5. import com.mkyong.test.core.TesterInfo.Priority;0 Y1 N; Q) S( I& B# o

  6. # T: L" J3 C$ m# L6 t& q8 a+ D4 g' p
  7. @TesterInfo(" X6 |- K$ V+ B( V
  8.         priority = Priority.HIGH, $ D8 `" |$ v5 g
  9.         createdBy = "mkyong.com",  
    ( r9 u" g! Y' S; w. P
  10.         tags = {"sales","test" }
    0 r6 Z7 U8 H8 O* h9 ~/ R" A( j( V
  11. )" l& v5 J, ~2 X1 V
  12. public class TestExample {
    ! g4 f$ k8 j/ t$ S; U* Z4 K% n
  13. / \* d/ g% u3 X8 i, ]
  14.         @Test
    - R* C) J( D/ H( v0 X0 }& \
  15.         void testA() {7 g* f7 }% N) t' C) Q% }. _
  16.           if (true)
    7 u1 n. O9 K6 ?
  17.                 throw new RuntimeException("This test always failed");
    - h' Y! F& |2 H3 Y2 f7 M0 X! O# v) d
  18.         }) U7 Q3 a( t0 ?3 H# A; o

  19. 8 [9 g" V3 O# `
  20.         @Test(enabled = false)  ^" {- U( G9 M
  21.         void testB() {# }) g( |2 b6 T8 |& Q
  22.           if (false)3 C  \3 A: g& \+ e. A; U7 S
  23.                 throw new RuntimeException("This test always passed");8 p! @- B" g  r4 l' w2 \) _8 C
  24.         }
    2 J; V% Z  A3 F3 q: i5 Q5 i/ R1 R$ C

  25. " m5 U+ V+ E  ]. n1 q! Z
  26.         @Test(enabled = true)% N1 u4 p0 g- w
  27.         void testC() {
    & T1 i. s9 ^( a# X
  28.           if (10 > 1) {
    * c- d3 ~3 L; h; `% R
  29.                 // do nothing, this test always passed.
    7 r; a( e; t8 L0 i% h. j0 q+ ~
  30.           }
    ! Y. ?3 ^% Z8 v  H
  31.         }
    , n4 [3 a# l# C6 r/ {; I7 t8 }8 G
  32. & r% s8 m# U- C( ?/ a/ \: i
  33. }
复制代码
; h3 e( g4 z5 b7 @
4. Java reflection – Read the Annotation下面的例子演示如何通过java反射来读取和处理自定义标注。
' q& }/ R# k; {3 d, k8 w+ O
5 T( J5 v' f0 X* o8 H$ {) iRunTest.java. E% V6 }. T& ~& x

9 B9 l7 r: z/ R; y7 ^1 T
  1. package com.mkyong.test;
    $ Q  y8 d$ \  P3 [5 R  Y

  2. 3 Y' e0 o4 C4 v* I8 Z  A: F
  3. import java.lang.annotation.Annotation;+ `7 Q! ^6 J3 M' }; H
  4. import java.lang.reflect.Method;
    $ S# ^* Q) n( M- z6 _' y

  5. ) \( }8 `! A5 Y
  6. import com.mkyong.test.core.Test;
    ( [6 j; d: {( t& I' f- H
  7. import com.mkyong.test.core.TesterInfo;+ f7 ]" q9 E! C: q
  8. 9 F% r3 {* U/ ~9 O5 X4 O8 v
  9. public class RunTest {( L1 L) E$ f% s* t" Z  l. t( h

  10. 5 \  q2 t7 J2 e$ e
  11.   public static void main(String[] args) throws Exception {+ z/ p& q# h: X' D' a, L: r

  12. 0 k/ \( i) Z' S" E9 ?! j+ q
  13.         System.out.println("Testing...");  H& g; v9 p& K. D
  14. % V  l  {, b2 A6 f! s; t5 O
  15.         int passed = 0, failed = 0, count = 0, ignore = 0;" ^- ~7 t: h& \* D' o' I' t: ]

  16. ! ^$ Y  T; e. A6 V" x( ^2 Y
  17.         Class<TestExample> obj = TestExample.class;* Z  P. V& k- a% s

  18. ; }8 B/ r# [. k# }
  19.         // Process @TesterInfo
    $ y# c, L# ?6 c2 G* K
  20.         if (obj.isAnnotationPresent(TesterInfo.class)) {0 \, @; ?2 m, h" m# d8 z/ `+ y. ]# `# E
  21. , C: I; b. ~/ q$ Z4 N
  22.                 Annotation annotation = obj.getAnnotation(TesterInfo.class);
    ! ?" W' f! C: {) L! s4 H5 i: M
  23.                 TesterInfo testerInfo = (TesterInfo) annotation;+ T3 @/ P  c2 V5 B' o2 ]/ z
  24. . O0 O) z; X8 R  v2 c
  25.                 System.out.printf("%nPriority :%s", testerInfo.priority());1 R  I% s: p2 \" p
  26.                 System.out.printf("%nCreatedBy :%s", testerInfo.createdBy());! C7 c/ G: C2 A  H& B3 F3 S
  27.                 System.out.printf("%nTags :");! @3 ]3 \- X9 X" C/ V  [" V
  28. 4 y' p; O7 m0 P% E/ i1 H1 Y& r
  29.                 int tagLength = testerInfo.tags().length;3 D7 U* E2 x( e- J- k, u  P
  30.                 for (String tag : testerInfo.tags()) {
    ; m- |+ K- z  V  S0 I
  31.                         if (tagLength > 1) {' v% d' @0 _/ i; M- M/ u6 [
  32.                                 System.out.print(tag + ", ");0 z8 C6 ^/ ?, w  c5 Z
  33.                         } else {: X2 F4 Z1 o/ F  E
  34.                                 System.out.print(tag);
    $ O( m9 d( @# d
  35.                         }
    & S% c0 V9 C: R2 h6 j
  36.                         tagLength--;
    4 B9 q; I: `$ d0 P& Z
  37.                 }6 I# L3 u( g8 d# n1 A. E2 B

  38. " X: u3 a7 {7 v% V' S
  39.                 System.out.printf("%nLastModified :%s%n%n", testerInfo.lastModified());
    # m, c9 p. y* R& T' V1 N

  40. * H8 F1 v% B; y8 y/ Z- J+ L2 C- a
  41.         }3 F2 ^( F4 ~. L# ]1 Q

  42. 3 ~) {; ]. k6 ~) I; F; L7 ]' M+ g) y
  43.         // Process @Test
    , Z7 d' ]+ }$ z3 H
  44.         for (Method method : obj.getDeclaredMethods()) {: \3 ^* o- g# x* Z! y

  45. / P8 `/ Z5 M5 ^7 N2 s' g/ _% Y0 {
  46.                 // if method is annotated with @Test
    9 [9 X4 I8 t# D9 z4 S3 F
  47.                 if (method.isAnnotationPresent(Test.class)) {
    # F  \, l+ `0 I8 I9 M+ L/ e
  48. 8 ?6 \  b; B$ \8 g
  49.                         Annotation annotation = method.getAnnotation(Test.class);" j2 q* L% S9 C" F3 x
  50.                         Test test = (Test) annotation;# S8 \( A" U7 T6 `6 z; X

  51. 7 V4 o+ {/ q* V+ L
  52.                         // if enabled = true (default)1 `( m0 C; u: v/ i5 i7 _0 G% J
  53.                         if (test.enabled()) {2 L4 c# v# I) B" o. A
  54. ! I, v. x! F7 _+ O$ v
  55.                           try {, \  N! a1 v- t$ ^$ c7 c- \
  56.                                 method.invoke(obj.newInstance());
    . G* H# N  y1 {) V" ]
  57.                                 System.out.printf("%s - Test '%s' - passed %n", ++count, method.getName());3 ^) o% O- _5 J( ~& {
  58.                                 passed++;% ]' ~( Q- E! ^" m3 x. F: E
  59.                           } catch (Throwable ex) {( v+ L% v* ~; V+ M: v: n2 R
  60.                                 System.out.printf("%s - Test '%s' - failed: %s %n", ++count, method.getName(), ex.getCause());% G' O3 E. w! W$ Z- t
  61.                                 failed++;9 _0 L; @- C! c6 |) j$ C! t. ~
  62.                           }
    ! Y4 s$ \- N4 m$ Y

  63. 5 a( m2 N; Z1 ]/ a& Z$ X
  64.                         } else {6 k* z3 q6 [0 ?, i
  65.                                 System.out.printf("%s - Test '%s' - ignored%n", ++count, method.getName());; Q$ D/ l3 M0 u  H
  66.                                 ignore++;
    1 l( m" `- w/ r. O1 V  W! g* e! C2 B
  67.                         }/ m( ?9 R8 g  _1 {6 `! F

  68. + o0 Z/ E& Y# p  ]( p% e5 A: O3 C
  69.                 }
    6 u3 p1 T( Q* J

  70. + \0 d' x4 Y7 F. s3 k2 P3 ^
  71.         }. R/ O9 P. v3 k) @: X
  72.         System.out.printf("%nResult : Total : %d, Passed: %d, Failed %d, Ignore %d%n", count, passed, failed, ignore);8 X( |8 S; D! j0 W" f

  73. 1 w! e$ Q6 Z$ T4 b4 {/ ], f
  74.         }
    & t- p" S/ D5 L
  75. }
复制代码
. p: L, _* b& A
Output
  1. Testing...0 q6 x" E" C* W' N

  2. ! i; y6 P5 p! q! Q. i, Y$ G$ A
  3. Priority :HIGH, U. Q0 K  P5 o; C1 w5 ^. r3 u
  4. CreatedBy :mkyong.com
    7 Z+ W, C6 U0 j; k; @- Z
  5. Tags :sales, <strong>test</strong>5 o/ }) M9 S! B, {3 d0 c6 t, [8 x
  6. LastModified :03<strong>/</strong>01<strong>/</strong><span style="color:#000000">2014</span>
    / Y0 S2 X4 l) `) c2 n3 |  O0 S- w
  7. + k9 N! C& T7 T' A" L$ L8 |1 m
  8. <span style="color:#000000">1</span> - Test <span style="color:#ff0000">'testA'</span> - failed: java.lang.RuntimeException: This <strong>test</strong> always failed
    2 Q* I" K! l/ K% Y+ Q& O
  9. <span style="color:#000000">2</span> - Test <span style="color:#ff0000">'testC'</span> - passed " ^; G, W& V" U/ p
  10. <span style="color:#000000">3</span> - Test <span style="color:#ff0000">'testB'</span> - ignored
    / V2 I- c5 K  i; X3 G! ^4 t  k

  11. 9 D' q  [' E; J8 m
  12. Result : Total : <span style="color:#000000">3</span>, Passed: <span style="color:#000000">1</span>, Failed <span style="color:#000000">1</span>, Ignore <span style="color:#000000">1</span>
复制代码
回复

使用道具 举报

96

主题

7

听众

406

金钱

四袋长老

该用户从未签到

板凳
发表于 2014-11-20 20:11:38 |只看该作者
自定义标签
回复

使用道具 举报

2

主题

0

听众

362

金钱

三袋弟子

该用户从未签到

地板
发表于 2014-11-21 19:53:09 |只看该作者
uperの小鬼 发表于 2014-11-20 20:11% d/ ?2 L' f  ?2 |$ G- T1 K& \
自定义标签?

4 k5 K+ E: t3 b  h注解- -。。
回复

使用道具 举报

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

   

关闭

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

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