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");
    }
}
相关推荐
大名顶顶1 分钟前
【JAVA实战】如何使用 Apache POI 在 Java 中写入 Excel 文件
java·spring boot·后端·计算机·程序员·编程·软件开发
gentle_ice1 小时前
leetcode——矩阵置零(java)
java·算法·leetcode·矩阵
whisperrr.2 小时前
【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南
java·架构·tomcat
火烧屁屁啦3 小时前
【JavaEE进阶】应用分层
java·前端·java-ee
m0_748257463 小时前
鸿蒙NEXT(五):鸿蒙版React Native架构浅析
java
我没想到原来他们都是一堆坏人3 小时前
2023年版本IDEA复制项目并修改端口号和运行内存
java·ide·intellij-idea
Suwg2094 小时前
【由浅入深认识Maven】第1部分 maven简介与核心概念
java·maven
花心蝴蝶.5 小时前
Spring MVC 综合案例
java·后端·spring
组合缺一7 小时前
Solon Cloud Gateway 开发:Helloword
java·gateway·solon