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方法,具体可以根据业务需要去写