第三十五条 注解优先于命名模式

Java 1.5之前,一般使用命名模式表明有些程序元素需要通过某种工具或者框架进行特殊处理,比如测试框架,要求一定要用test作为测试方法名称的开头。方法可行,但一旦明明错误,或者单词大小写弄错了,字母顺序弄颠倒了,程序都不会执行,并且也不会报错;test开头的方法只能在方法中生效,不能以类为基础生效;没有提供将参数值与程序元素关联起来的好方法。注解能解决上述的几个问题,让他们运行,并且在编译时抛出异常

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
}

RetentionPolicy.RUNTIME 表示Test注解在运行时保留,ElementType.METHOD表示只有在该方法声明中Test注解
才是合法的。书中的test命名模式案例,是在方法的前面以test开头命名,而命名模式上面,方法上面加上 @Test 标示,来
标示的,

@Test public static void m1() {
}

public static void main(String[] args) throws ClassNotFoundException {
        int tests = 0;
        int passed = 0;
        Class testClass = Class.forName("Test");
        for(Method m : testClass.getDeclaredMethods()) {
            if(m.isAnnotationPresent(Test.class)) {
                tests++;
                try {
                    m.invoke(null);
                    passed++;
                } catch(InvocationTargetException wrappedExc) {
                    Throwable exc = wrappedExc.getCause();
                    System.out.println(m + " failed: " + exc);
                } catch(Exception e) {
                    System.out.println("INVALID @Test: " + m);
                }
                
            }
        }
        System.out.printf("Passed: %d, Failed: %d%n", passed, tests - passed);
    }

if(m.isAnnotationPresent(Test.class)) 这个判断语句是关键,通过搜寻方法的注解命名,来找到对应的方法。通过使用完全匹配的类名,并通过调用Method.invoke方法,用反射式的运行类中所有标注了test的方法,isAnnotationPresent 知工具要运行哪些方法,并作出相对应的操作。注解的方法很灵活,我们可以通过注解来自定义位移的方法,来找到类中的方法,然后传递数据,做出对应的操作,达到解耦的目的,EventBus 就是一个很好的案例;听过注解和反射,android 中的网络框架 Retrofit 也是一个经典案例;注解的用法很广泛,需要深入研究,配合加载器,可以自动生成对应的.class文件,而不用我们自己去定义。总之,有了注解 , 就不必再用命名模式了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值