@author:Edison丶梦楠
转载请注明作者!
在声明注解时只需要掌握两个:
1:@Retention设置为 RUNTIME。 --àRetentionPolicy枚举类中
SOURCE和CLASS时期我们不需要掌握,想要了解,可以查看此枚举类的API
2:@Target 设置为(ElementType.xxx ) xxx表示设置这个注解标签可以贴在哪个上。例如:ElmentType.METHOD 表示此标签可以贴在方法上。具体参照API
ElementType是一个枚举类,里面有几个固定的枚举对象。
另外:我们要明白的就是:注解得有三个东西:
1:要贴的标签。
2:被贴的程序(类、方法、字段、构造器….)
3:一个约束标签的程序
获取类中的构造器注解(类、字段、方法获取实现代码不一 一给出):
1:先拿到这份要获取注解的类的字节码文件
2:通过字节码文件调用getConstructor()方法得到构造器对象
3:通过构造器对象的getAnnotation(注解的字节码对象) 获取注解对象
4:判断注解对象是否为空,再进一步书写业务逻辑
下面给出实现代码:
思路:如果我们想要获取一个类的注解:
1:拿到这个类的字节码对象
2:利用字节码对象的getAnnotation (注解的字节码对象) 方法返回这个注解的对象。
3:判断。(具体业务逻辑根据实际情况编写)
如果我们想要获取一个类中所有方法的注解:
1:首先拿到要获取注解的类的字节码文件对象
2:通过此字节码对象的getMethod(name,param);获取方法对象
ps:name为要获取的方法名
param为方法内 参数的字节码 例如:方法内如果有String xxx参数,那么parama就等于String.class
3通过方法对象调用getAnnotation(注解文件的字节码); 返回此注解字节码的对象
4:判断
下面是利用自定义Annotation模拟实现eclipse自带Junit插件,实现单元测试。
package com.hard.junit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
自定义注解 Junit之MyBefor
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyBefor {
}
package com.hard.junit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定义注解 Junit之MyTest
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
package com.hard.junit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定义注解 Junit之MyAfter
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAfter {
}
package com.hard.junit;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* @author Edison丶楠
* 创建时间:2018年12月6日00:13:07
* 功能:模拟eclipse自带插件Junit
*/
public class MyJunit {
public static void main(String[] args) throws Exception {
Class> clz = Class.forName("com.hard.junit.Test");
Method[] ms = clz.getMethods();
List testList = new ArrayList<>();
List afterList = new ArrayList<>();
List beforList = new ArrayList<>();
for (Method method : ms) {
if(method.isAnnotationPresent(MyTest.class)) {
testList.add(method);
}else if(method.isAnnotationPresent(MyAfter.class)) {
afterList.add(method);
}else if(method.isAnnotationPresent(MyBefor.class)) {
beforList.add(method);
}
}
Object instance = clz.newInstance();
for (Method blist : testList) {
for (Method tlist : beforList) {
tlist.invoke(instance);
}
blist.invoke(instance);
for (Method alist : afterList) {
alist.invoke(instance);
}
}
}
}
package com.hard.junit;
/*
模拟测试代码
*/
public class Test {
@MyTest
public void save() {
System.out.println("保存信息");
}
@MyBefor
public void select() {
System.out.println("查询信息");
}
@MyAfter
public void delete() {
System.out.println("删除信息");
}
}