1)自定义Annotation接口,如下所示
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String name() default "[defaultMethod]";
}
其中RetentionPolicy表示指定保留多长的注释,其取值范围为
CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。 |
RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 |
SOURCE 编译器要丢弃的注释。 |
ElementType代表什么情况下使用注释类型是合法的
ANNOTATION_TYPE 注释类型声明 |
CONSTRUCTOR 构造方法声明 |
FIELD 字段声明(包括枚举常量) |
LOCAL_VARIABLE 局部变量声明 |
METHOD 方法声明 |
PACKAGE 包声明 |
PARAMETER 参数声明 |
TYPE 类、接口(包括注释类型)或枚举声明 |
(2)自定义类,在类中调用使用自定义注解
public class MyNameClass {
@MyAnnotation(name="test1")
public void testOne(){
System.out.println("testOne");
}
@MyAnnotation(name="test2")
public void testTwo(){
System.out.println("testTwo");
}
@MyAnnotation(name="test3")
public void testThree(){
System.out.println("testThree");
}
}
(3)主方法,在主方法中通过反射调用此类
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
Object obj = Class.forName("com.test.annotation.MyNameClass").newInstance();
for (Method m : obj.getClass().getMethods()) {
if (m.isAnnotationPresent(MyAnnotation.class)) {
try {
System.out.println(m.getAnnotation(MyAnnotation.class).name());
//TODO 在业务中需要添加的功能,如登录验证、缓存等等等等
m.invoke(obj);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
我们在实际开发中可以通过Spring框架完成拦截,自定义类继承MethodInterceptor类,重载invoke方法,具体可以根据业务需要去写