AOP-前置原理-怎么判断和拦截?

判断模式

  • 类型(Class)
  • 方法(Method)
  • 注解 (Annotation)
  • 参数 (Parameter)
  • 异常 (Exception)
java 复制代码
public class TargetFilterDemo {
   public static void main(String[] args) throws ClassNotFoundException {
       String targetClassName = "com.yong.EchoService";
       Class<?> clazz = Class.forName(targetClassName);
       // 拦截类
       boolean assignableFrom = clazz.isAssignableFrom(EchoService.class);
       System.out.println(assignableFrom);
       // 通过方法名称和参数类型找到对应的方法
       Method method = ReflectionUtils.findMethod(clazz, "echo", String.class);
       System.out.println(method);
       // 过滤拦截方法 只对某个方法进行拦截
       ReflectionUtils.doWithMethods(clazz, (m) -> {
           System.out.println("i am target method! " + m.getName() + " paramCount " + m.getParameterCount());
       }, (m) -> {
           // 抛出RuntimeException异常的方法进行拦截
           Class<?>[] exceptionTypes = m.getExceptionTypes();
           if (exceptionTypes.length > 0 && RuntimeException.class == exceptionTypes[0]) {
               return true;
           }
           // 根据注解拦截
           Intercept[] annotation = m.getDeclaredAnnotationsByType(Intercept.class);
           return annotation != null && annotation.length > 0;
       });
   }
}

拦截模式

  • 前置拦截
  • 后置拦截
  • 异常拦截
    我们直接看例子,当拦截以后我们可以进行一系列操作,这只是初步了解一下怎么实现各种拦截,真实的AOP比这种方式更复杂,后文中会进行讨论。
java 复制代码
public class CustomInvocationHandler implements InvocationHandler {
    private final BeforeInterceptor beforeInterceptor;
    private final AfterInterceptor afterInterceptor;
    private final FinallyInterceptor finallyInterceptor;

    private final ExceptionInterceptor exceptionInterceptor;

    public CustomInvocationHandler(BeforeInterceptor beforeInterceptor, AfterInterceptor afterInterceptor, FinallyInterceptor finallyInterceptor, ExceptionInterceptor exceptionInterceptor) {
        this.beforeInterceptor = beforeInterceptor;
        this.afterInterceptor = afterInterceptor;
        this.finallyInterceptor = finallyInterceptor;
        this.exceptionInterceptor = exceptionInterceptor;
    }
	// 动态代理进行拦截
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 方法调用前
        if (beforeInterceptor != null) {
            beforeInterceptor.before(proxy, method, args);
        }
        Object result = null;
        try {
            EchoService echoService = new DefaultEchoService();
            result = method.invoke(echoService, args);
            // 方法调用后
            if (afterInterceptor != null) {
                afterInterceptor.after(proxy, method, args, result);
            }
           
        } catch (Exception e) {
            // 发生异常后
            if (exceptionInterceptor != null) {
                exceptionInterceptor.exception(proxy, method, args, e);
            }

        } finally {
            // finally
            if (finallyInterceptor != null) {
                finallyInterceptor.finallyExecute(proxy, method, args, result);
            }
        }
        return result;
    }
}
java 复制代码
public class DynamicProxyDemo {
    public static void main(String[] args) {
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        BeforeInterceptor beforeInterceptor = new DefaultBeforeInterceptor();
        AfterInterceptor afterInterceptor = new DefaultAfterInterceptor();
        FinallyInterceptor finallyInterceptor = new DefaultFinallyInterceptor();
        ExceptionInterceptor exceptionInterceptor = new DefaultExceptionInterceptor();
        EchoService proxyEchoService = (EchoService) Proxy.newProxyInstance(contextClassLoader, new Class[]{EchoService.class}, new CustomInvocationHandler(beforeInterceptor, afterInterceptor, finallyInterceptor, exceptionInterceptor));
        proxyEchoService.echo("hello World");
    }
}
相关推荐
北漂老男孩8 分钟前
IntelliJ IDEA 调试技巧指南
java·ide·intellij-idea
八股文领域大手子41 分钟前
Leetcode32 最长有效括号深度解析
java·数据库·redis·sql·mysql
上官美丽42 分钟前
Springboot中的@ConditionalOnBean注解:使用指南与最佳实践
java·spring boot·mybatis
Another Iso2 小时前
Windows安装Apache Maven 3.9.9
java·maven
鹏神丶明月天2 小时前
mybatis_plus的乐观锁
java·开发语言·数据库
fantasy_42 小时前
Java数据类型 Arrays VS ArraysList VS LikedList 解析
java
IT__learning2 小时前
Java通过Apache POI操作Excel
java·apache·excel
ylfhpy2 小时前
Java面试黄金宝典1
java·开发语言·算法·面试·职场和发展
loveking62 小时前
SpringBoot实现发邮件功能+邮件内容带模版
java·spring boot·后端
liuyang___3 小时前
Spring boot+mybatis的批量删除
java·spring boot·mybatis