判断模式
类型(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; } @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 { 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" ) ; }
}