当前位置 > it书童 > java > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

java自定义注解

java it书童 2020-12-02 09:47:03 0赞 0踩 328阅读 0评论

定义新的注解类型使用@interface关键字定义一个新的注解类型

定义了该注解之后,就可以在程序的任何地方使用该注解

注解不仅可以是这种简单的注解,还可以带成员变量,成员变量在注解定义中以无形参的方法形式来声明

根据注解是否可以包含成员变量,可以把注解分为如下两类。

  • 标记注解:没有定义成员变量的注解类型被称为标记。这种注解仅利用自身的存在与否来提供信息,如前面介绍的@Override、@Test等注解

  • 元数据注解:包含成员变量的注解,因为它们可以接受更多的元数据,所以也被称为元数据注解

自定义一个注解

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

调用注解:

public class MyTest {
    @Testable
    public static void m1() {
    }
    public static void m2() {
    }
    @Testable
    public static void m3() {
        throw new IllegalArgumentException("参数出错了");
    }
    public static void m4() {
    }
    @Testable
    public static void m5() {
    }
    public static void m6() {
    }
    @Testable
    public static void m7() {
        throw new RuntimeException("程序业务出现异常");
    }
    public static void m8() {
    }
}

如前所述,未经处理的注解不会对程序产生任何影响,我们还可以自定义注解工具

public class ProcessorTest {
    public static void process(String clazz) throws ClassNotFoundException {
        int passed = 0;
        int failed = 0;
        for (Method m : Class.forName(clazz).getMethods()) {
            // 如果类中的方法使用了 @Testable 注解
            if (m.isAnnotationPresent(Testable.class)) {
                try {
                    // 调用 m 方法
                    m.invoke(null);
                    passed ++;
                } catch (IllegalAccessException | InvocationTargetException e) {
                    System.out.println("方法" + m + "运行失败,异常:" + e.getMessage());
                    failed ++;
                }
            }
        }
        System.out.println("共运行了 " + (passed + failed) + " 个方法,其中:失败了 " + failed + " 个, 成功了 " + passed + " 个");
    }
}

测试:

public class RunTests {
    public static void main(String[] args) throws ClassNotFoundException {
        // 需要用完整的包名+类名
        ProcessorTest.process("crazy.chart14.section03.MyTest");
    }
}

结果:

源码 javaDemo f7d5258

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/918