java 自定義注解(翻譯)

引用:[Java Custom Annotations Example]{http://www.mkyong.com/java/java-custom-annotations-example/}

在android 的開源項(xiàng)目butterknife,使用注解的方式店溢,解放了android中view的注入飒泻,下面通過一個(gè)列子學(xué)習(xí)一下注解祈秕。

在這個(gè)例子中牺弄,向你展示怎樣創(chuàng)建兩個(gè)自定義注解Annotation---@Test和@TestInfo, 進(jìn)行單元測(cè)試

1:@Test 注解

這個(gè)@interface告訴java這個(gè)一個(gè)自定義的注解嗽元,然后你可以使用這個(gè)注解在類的方法上使用障般,例如:@Test(enable=false).

package com.mkyong.test.core;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) //can use in method only.
public @interface Test {

    //should ignore this test?
    public boolean enabled() default true;

}

筆記:

@Retention,@Target 都是元注解,(用來標(biāo)注注解的注解叫做元注解)

@Retention(RetentionPolicy.RUNTIME) 表示運(yùn)行時(shí)也保留該注解

@Target(ElementType.METHOD) 表示只能在方法的上面使用它,如果是ElementType.TYPE就表示在類的上面使用默勾。

2.@TesterInfo 注解

這個(gè)@TesterInfo自定義注解應(yīng)用到類上袍镀,這個(gè)展示了其中方法返回的不同類型,有枚舉闽巩,數(shù)組钧舌,字符串等

package com.mkyong.test.core;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) //on class level
public @interface TesterInfo {

    public enum Priority {
       LOW, MEDIUM, HIGH
    }

    Priority priority() default Priority.MEDIUM;

    String[] tags() default "";

    String createdBy() default "Mkyong";

    String lastModified() default "03/01/2014";

}

@Target(ElementType.TYPE) 表示只能就表示在類的上面使用。

3: 單元測(cè)試的例子

使用自定義的@Test涎跨,和@TesterInfo洼冻,在這個(gè)測(cè)試?yán)又小?/strong>

package com.mkyong.test;

import com.mkyong.test.core.Test;
import com.mkyong.test.core.TesterInfo;
import com.mkyong.test.core.TesterInfo.Priority;

@TesterInfo(
    priority = Priority.HIGH,
    createdBy = "mkyong.com",
    tags = {"sales","test" }
)
public class TestExample {

    @Test
    void testA() {
      if (true)
        throw new RuntimeException("This test always failed");
    }

    @Test(enabled = false)
    void testB() {
      if (false)
        throw new RuntimeException("This test always passed");
    }

    @Test(enabled = true)
    void testC() {
      if (10 > 1) {
        // do nothing, this test always passed.
      }
    }

}

上面的例子中,@Testinfo用在類上隅很,@test用在方法上

4. 反射獲取注解

下面的這個(gè)例子撞牢,通過反射的api,去讀取自定義注解的信息

package com.mkyong.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import com.mkyong.test.core.Test;
import com.mkyong.test.core.TesterInfo;

public class RunTest {

 public static void main(String[] args) throws Exception {

   System.out.println("Testing...");

   int passed = 0, failed = 0, count = 0, ignore = 0;

   Class<TestExample> obj = TestExample.class;

   // Process @TesterInfo
   if (obj.isAnnotationPresent(TesterInfo.class)) {

       Annotation annotation = obj.getAnnotation(TesterInfo.class);
       TesterInfo testerInfo = (TesterInfo) annotation;

       System.out.printf("%nPriority :%s", testerInfo.priority());
       System.out.printf("%nCreatedBy :%s", testerInfo.createdBy());
       System.out.printf("%nTags :");

       int tagLength = testerInfo.tags().length;
       for (String tag : testerInfo.tags()) {
           if (tagLength > 1) {
               System.out.print(tag + ", ");
           } else {
               System.out.print(tag);
           }
           tagLength--;
       }

       System.out.printf("%nLastModified :%s%n%n", testerInfo.lastModified());

   }

   // Process @Test
   for (Method method : obj.getDeclaredMethods()) {

       // if method is annotated with @Test
       if (method.isAnnotationPresent(Test.class)) {

           Annotation annotation = method.getAnnotation(Test.class);
           Test test = (Test) annotation;

           // if enabled = true (default)
           if (test.enabled()) {

             try {
               method.invoke(obj.newInstance());
               System.out.printf("%s - Test '%s' - passed %n", ++count, method.getName());
               passed++;
             } catch (Throwable ex) {
               System.out.printf("%s - Test '%s' - failed: %s %n", ++count, method.getName(), ex.getCause());
               failed++;
             }

           } else {
               System.out.printf("%s - Test '%s' - ignored%n", ++count, method.getName());
               ignore++;
           }

       }

   }
   System.out.printf("%nResult : Total : %d, Passed: %d, Failed %d, Ignore %d%n", count, passed, failed, ignore);

   }
}

結(jié)果:

Testing...

Priority :HIGH
CreatedBy :mkyong.com
Tags :sales, test
LastModified :03/01/2014

1 - Test 'testA' - failed: java.lang.RuntimeException: This test always failed
2 - Test 'testC' - passed
3 - Test 'testB' - ignored

Result : Total : 3, Passed: 1, Failed 1, Ignore 1

先是獲取類上的注解@TesterInfo的信息叔营,然后獲取方法上的注解@Test的信息

其中在android stuido中運(yùn)行java文件屋彪,可以在android項(xiàng)目的單元測(cè)試中編寫,然后運(yùn)行就好绒尊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畜挥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婴谱,更是在濱河造成了極大的恐慌蟹但,老刑警劉巖躯泰,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異华糖,居然都是意外死亡麦向,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門客叉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诵竭,“玉大人,你說我怎么就攤上這事兼搏÷盐浚” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵向族,是天一觀的道長(zhǎng)呵燕。 經(jīng)常有香客問我,道長(zhǎng)件相,這世上最難降的妖魔是什么再扭? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮夜矗,結(jié)果婚禮上泛范,老公的妹妹穿的比我還像新娘。我一直安慰自己紊撕,他們只是感情好罢荡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著对扶,像睡著了一般区赵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浪南,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天笼才,我揣著相機(jī)與錄音,去河邊找鬼络凿。 笑死骡送,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的絮记。 我是一名探鬼主播摔踱,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼怨愤!你這毒婦竟也來了派敷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎篮愉,沒想到半個(gè)月后般眉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潜支,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柿汛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冗酿。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖络断,靈堂內(nèi)的尸體忽然破棺而出裁替,到底是詐尸還是另有隱情,我是刑警寧澤貌笨,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布弱判,位于F島的核電站,受9級(jí)特大地震影響锥惋,放射性物質(zhì)發(fā)生泄漏昌腰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一膀跌、第九天 我趴在偏房一處隱蔽的房頂上張望遭商。 院中可真熱鬧,春花似錦捅伤、人聲如沸劫流。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祠汇。三九已至,卻和暖如春熄诡,著一層夾襖步出監(jiān)牢的瞬間可很,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工粮彤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留根穷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓导坟,卻偏偏與公主長(zhǎng)得像屿良,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惫周,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,755評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理尘惧,服務(wù)發(fā)現(xiàn),斷路器递递,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • “你記不記得我們還是網(wǎng)友剛剛認(rèn)識(shí)的時(shí)候喷橙,你就約我出門啥么?” “什么時(shí)候啊贰逾? 我怎么不記得了悬荣?” “...
    steropeg閱讀 664評(píng)論 4 3
  • 那一年的秋天,小武河兩岸開滿了美麗的雛菊疙剑。十五歲的我在攔河大壩上騎著自行車去往黃山中學(xué)的路上氯迂。 途徑一大片野菊花的...
    雙面老孫閱讀 538評(píng)論 0 1
  • 今天出點(diǎn)小意外,車壞半路了言缤。心情極不好嚼蚀。37度高溫,汗向下流管挟。 很不巧轿曙,工作上經(jīng)理指出,這不合理那不合理僻孝,這沒有上...
    沐子芳菲閱讀 185評(píng)論 0 0