判断模式
- 类型(Class)
- 方法(Method)
- 注解 (Annotation)
- 参数 (Parameter)
- 异常 (Exception)
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) -> {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比这种方式更复杂,后文中会进行讨论。
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;}@Overridepublic 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 {if (finallyInterceptor != null) {finallyInterceptor.finallyExecute(proxy, method, args, result);}}return result;}
}
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");}
}