注解
概念
JDK1.5之后的新特性
说明程序的,给计算机看的
作用分类
编写文档:
通过代码里标识的元数据生成文档(生成doc文档)
package annotation;
/**
* @author 闻人醉
* @since 1.5
* @version 1.0
*/
public class AnnoDemo1 {
/**
* 计算两数的和
* @param a 参数
* @param b 参数
* @return 返回值
*/
public int add(int a,int b){
return a+b;
}
}
在命令窗口通过 javadoc AnnDemo1.java 可生成doc文档
出现 编码 GBK 的不可映射字符 (0x9C)
javadoc -encoding UTF-8 文件名.java 即可
代码分析:
通过代码里标识的元数据对代码进行分析(使用反射)
编译检查:
通过代码里标识的元数据让编译器能够实现基本的编译检查(Override)
JDK中预定义的一些注解
@Override:检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@SuppressWarnings("all"):压制所有的编译器警告
自定义注解
/*格式 其本质就是一个接口*/
元注解
public @interface 注解名称{}
属性
接口中的抽象方法
要求
1.属性的返回值类型
基本数据类型
String
枚举(enum)
以上类型的数组
2.定义了属性,在使用时需要给属性赋值
如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不给属性赋值
数组赋值时如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值就可以
元注解
用于描述注解的注解
1. @Target:描述注解能够作用的位置
ElementType取值:
.TYPE:可以作用于类上
.METHOD:可以作用于方法上
.FIELD:可以作用于成员变量上
2. @Retention:描述注解被保留的阶段
RetentionPolicy.RUNTIME:被描述的注解会保留到class字节码文件中,并被JVM读取到
3. @Documented:描述注解被抽取到api文档中
4. @Inherited:描述注解被子类继承
在程序中使用注解
获取注解中定义的属性值
//1.解析注解
//1.1获取该类的字节码文件
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//2.获取上边的注解对象
//其实就是在内存中生成了一个该注解接口的子类实现对象
Pro annotation = reflectTestClass.getAnnotation(Pro.class);
//3.调用注解对象中定义的抽象方法,获取返回值
String className = annotation.className();
String methodName = annotation.methodName();
System.out.println(className);
System.out.println(methodName);
案例
/**
* @author 闻人醉
* 简单的测试框架
*
* 当主方法执行后,会自动检测被Check注解的所有方法,判断是否有异常,记录到文件中
*/
public class TestCheck {
public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException {
//1.创建计算器对象
Calculator c = new Calculator();
//2.获取字节码文件对象
Class<? extends Calculator> aClass = c.getClass();
//3.获取所有方法
Method[] methods = aClass.getMethods();
//出现异常的次数
int number = 0;
BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));
for (Method method : methods) {
//4.判断方法上是否有Check注解
if (method.isAnnotationPresent(Check.class)){
//5.有,执行
Object o = aClass.newInstance();
try {
method.invoke(o);
} catch (Exception e) {
//6.捕获异常,记录到文件中
number++;
bw.write(method.getName()+"方法出异常了");
bw.newLine();
bw.write("异常的名称:"+e.getCause().getClass().getSimpleName());
bw.newLine();
bw.write("异常的原因:"+e.getCause().getMessage());
bw.newLine();
bw.write("----------");
}
}
}
bw.write("本次测试一共出现"+number+"次异常");
bw.write("----------");
bw.flush();
bw.close();
}
}
转载:https://blog.csdn.net/kiligzzz/article/details/105920471
查看评论