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");
    }
}
相关推荐
李宥小哥2 小时前
C#基础11-常用类
android·java·c#
小许学java3 小时前
数据结构-ArrayList与顺序表
java·数据结构·顺序表·arraylist·线性表
Java 码农4 小时前
Centos7 maven 安装
java·python·centos·maven
harmful_sheep4 小时前
maven mvn 安装自定义 jar 包
java·maven·jar
007php0075 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
JH30735 小时前
第七篇:Buffer Pool 与 InnoDB 其他组件的协作
java·数据库·mysql·oracle
皮皮林5516 小时前
订单分库分表后,商家如何高效的查询?
java
Roye_ack7 小时前
【项目实战 Day12】springboot + vue 苍穹外卖系统(Apache POI + 工作台模块 + Excel表格导出 完结)
java·spring boot·后端·excel·苍穹外卖
Code blocks8 小时前
SpringBoot自定义请求前缀
java·spring boot·后端
Jabes.yang9 小时前
Java求职面试:从Spring Boot到Kafka的技术探讨
java·spring boot·面试·kafka·互联网大厂