注解分类
注解在我的理解下,就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。
自定义注解,jdk内置注解,框架提供的注解
自定义注解的时候可以使用@target指定该注解可以在哪里使用,@Retention可以指定注解在源码阶段,编译阶段,运行时阶段起作用,可以理解为注解的生命周期,java原生注解大多为标记检查的作用。
作用
贴在一个类,一个方法上面。它的目的是为当前读取该注解的程序提供判断依据及少量附加信息。比如程序只要读到加了@Test的方法,就知道该方法是待测试方法,又比如@Before注解,程序看到这个注解,就知道该方法要放在@Test方法之前执行。有时我们还可以通过注解属性,为将来读取这个注解的程序提供必要的附加信息,比如@RequestMapping(“/user/info”)提供了Controller某个接口的URL路径。
级别
注解和接口,枚举,类是同一个级别
注解的本质
注解本质其实就是一个接口,反编译.class文件后发现@interface变成了interface,而且自动继承了Annotation,里面的方法默认是public abstract。可以给里面的方法设置默认值。当程序运行的时候可以使用反射获取哪些方法或者类使用了注解。
它的目的是为当前读取该注解的程序提供判断依据及少量附加信息。比如程序只要读到加了@Test的方法,就知道该方法是待测试方法,又比如@Before注解,程序看到这个注解,就知道该方法要放在@Test方法之前执行。有时我们还可以通过注解属性,为将来读取这个注解的程序提供必要的附加信息,比如@RequestMapping(“/user/info”)提供了Controller某个接口的URL路径
自定义注解
MyBefore注解(定义注解)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyBefore {
}
使用注解
public class EmployeeDAOTest {
@MyBefore
public void init() {
System.out.println("初始化...");
}
@MyAfter
public void destroy() {
System.out.println("销毁...");
}
@MyTest
public void testSave() {
System.out.println("save...");
}
@MyTest
public void testDelete() {
System.out.println("delete...");
}
}
读取注解,相当于我们使用Junit时看不见的那部分(在隐秘的角落里帮我们执行标注了@Test的方法)
作者:bravo1988
链接:https://www.zhihu.com/question/24401191/answer/1724982163
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
public class MyJunitFrameWork {
public static void main(String[] args) throws Exception {
// 1.先找到测试类的字节码:EmployeeDAOTest
Class clazz = EmployeeDAOTest.class;
Object obj = clazz.newInstance();
// 2.获取EmployeeDAOTest类中所有的公共方法
Method[] methods = clazz.getMethods();
// 3.迭代出每一个Method对象,判断哪些方法上使用了@MyBefore/@MyAfter/@MyTest注解
List<Method> myBeforeList = new ArrayList<>();
List<Method> myAfterList = new ArrayList<>();
List<Method> myTestList = new ArrayList<>();
for (Method method : methods) {
if (method.isAnnotationPresent(MyBefore.class)) {
//存储使用了@MyBefore注解的方法对象
myBeforeList.add(method);
} else if (method.isAnnotationPresent(MyTest.class)) {
//存储使用了@MyTest注解的方法对象
myTestList.add(method);
} else if (method.isAnnotationPresent(MyAfter.class)) {
//存储使用了@MyAfter注解的方法对象
myAfterList.add(method);
}
}
// 执行方法测试
for (Method testMethod : myTestList) {
// 先执行@MyBefore的方法
for (Method beforeMethod : myBeforeList) {
beforeMethod.invoke(obj);
}
// 测试方法
testMethod.invoke(obj);
// 最后执行@MyAfter的方法
for (Method afterMethod : myAfterList) {
afterMethod.invoke(obj);
}
}
}
}