概述
- 注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。这些工具可以在源码层次上进行操作,或者可以处理编译器在其中放置了注解的类文件。
- 注解不会改变程序的编译方式。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");
}
}