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");
    }
}
相关推荐
Dcs几秒前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing6 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者18 分钟前
Java的SPI机制详解
java
超级小忍40 分钟前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug44 分钟前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
苦学编程的谢1 小时前
Maven
java·maven·intellij-idea
考虑考虑1 小时前
Maven 依赖范围(Scope)
java·后端·maven