Java SE | 高级特性 | 注解

概述

  • 注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。这些工具可以在源码层次上进行操作,或者可以处理编译器在其中放置了注解的类文件。
  • 注解不会改变程序的编译方式。Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令。
  • 为了能够受益于注解,你需要选择一个处理工具,然后向你的处理工具可以理解的代码中插入注解,之后运用该处理工具处理代码。
  • 注解的使用范围还是很广泛的,并且这种广泛性让人乍一看会觉得有些杂乱无章。下面是关于注解的一些可能的用法:

附属文件的自动生成,例如部署描述符或者bean信息类。

测试、日志、事务语义等代码的自动生成。

示例

  • 使用注解获取test()方法
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String className();
    String methodName();
}
public class Demo {
    public void test() {
        System.out.println("test方法执行。。。");
    }
}
@Pro(className = "demo1.Demo",methodName = "test")
public class Test1 {
    public static void main(String[] args) throws Exception{
        // 解析注解
        // 获取字节码对象
        Class<Test1> t1 = Test1.class;
        // 获取注解
        Pro annotation = t1.getAnnotation(Pro.class);
        // 调用方法
        String s = annotation.className();
        String s1 = annotation.methodName();
        System.out.println(s);
        System.out.println(s1);

        //反射
        Class<?> cls = Class.forName(s); // 加载.class文件
        Object o = cls.newInstance(); // 构造对象
        Method method = cls.getMethod(s1); // 找到指定方法
        method.invoke(o); // 执行方法
    }
}
  • 使用注解监测方法的异常
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Check {
}
/**
 * 测试框架
 *        主方法执行主动监测带 @Check 的方法,有异常记录
 */
public class TestCheck {
    public static void main(String[] args) throws IOException {
        // 获取计算机
        Calculator c = new Calculator();
        // 获取字节码文件对象
        Class<? extends Calculator> cls = c.getClass();
        // 获取执行方法
        Method[] methods = cls.getMethods();
        // 标记异常
        int count = 0;
        BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt"));
        // 判断有 @Check 并执行
        for (Method m : methods) {
            if (m.isAnnotationPresent(Check.class)) {
                try {
                    m.invoke(c,null);
                } catch (Exception e) {
                    count++;
                    bw.write(m.getName()+"方法异常了");
                    bw.newLine();
                    bw.write("异常名称:"+e.getCause().getClass().getCanonicalName());
                    bw.newLine();
                    bw.write("异常原因:"+e.getCause().getMessage());
                    bw.newLine();
                }
            }
        }
        bw.write("本次异常数量:"+count);
        bw.flush();
        bw.close();
    }
}
public class Calculator {
    @Check
    public void add() {
        String name = null;
        System.out.println(name.equals(123));
        System.out.println("1 + 0"+"="+(1+0));
    }
    @Check
    public void sub() {
        System.out.println("1 - 0"+"="+(1-0));
    }
    @Check
    public void mul() {
        System.out.println("1 x 0"+"="+(1*0));
    }
    @Check
    public void div() {
        System.out.println("1 / 0"+"="+(1/0));
    }
    public void show() {
        System.out.println("没有BUG");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值