现象描述:假设有一个service,其中有A B 两个方法,A B都被aop托管,且A中调用了B方法,这时请求方法A的时候只会触发A的aop逻辑而不会触发B的aop逻辑。
public interface UserService {
void test();
}
public class UserServiceImpl implements UserService {
@Override
public void test() {
System.out.println("UserService 逻辑执行。。。。");
}
}
jdk动态代理:
/**
*代理类真正执行的是InvocationHandler的invoke方法
*/
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object obj) {
this.target = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Befroe invoke .............");
Object r = method.invoke(target, args);
System.out.println("After invoke ...............");
return r;
}
}
UserServiceImpl impl = new UserServiceImpl();
UserService service =
(UserService) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
impl.getClass().getInterfaces(), new MyInvocationHandler(impl));
service.test();
//这里将动态代理生成的类文件写入磁盘,方便反编译
byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy11",
UserServiceImpl.class.getInterfaces());
FileOutputStream out = null;
try {
out = new FileOutputStream("C:\\Users\\nieyanshun\\Desktop\\test\\clazz.class");
out.write(classFile);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != out)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是jdk动态代理的示例代码,我们反编译看下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import org.flying.bird.rpc.proxy.UserService;
public final class $Proxy11
extends Proxy
implements UserService
{
private static Method m1;
private static Method m3;
private static Method m2;
private static Method m0;
public $Proxy11(InvocationHandler paramInvocationHandler)
{
super(paramInvocationHandler);
}
public final boolean equals(Object paramObject)
{
try
{
return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final void test()
{
try
{
this.h.invoke(this, m3, null);
return;
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final String toString()
{
try
{
return (String)this.h.invoke(this, m2, null);
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final int hashCode()
{
try
{
return ((Integer)this.h.invoke(this, m0, null)).intValue();
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
static
{
try
{
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
m3 = Class.forName("org.flying.bird.rpc.proxy.UserService").getMethod("test", new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
return;
}
catch (NoSuchMethodException localNoSuchMethodException)
{
throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
}
catch (ClassN