用过JDK动态代理的人都熟悉下面的代码:
interface Subject{void doSomething();}
class RealSubject implements Subjuect{
public int var = 10;
public void doSomething(){System.out.println("RealSubject.doSomething");}
}
public class SubjectProxyHandler implements InvocationHandler{
private Object proxiedObject;
public Object createProxy(Object target) { //该函数传入被代理对象,返回代理对象
this.proxiedObject = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) {
//直接调用被对象对象的方法,下面两行随便哪个都能正常执行
return method.invoke(proxiedObject, args);
return method.invoke(getJdkDynamicProxiedObject(proxy),args))
result=
System.out.println("事物结束");
return result;
}
//下面的函数传入代理对象,返回被代理对象
private static Object getJdkDynamicProxiedObject(Object proxy) {
Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
h.setAccessible(true);
AopProxy aopProxy = (AopProxy) h.get(proxy);
Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);
Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
return target;
}
}
以上忽略了main函数创建实际对象、代理对象等过程,以上代码没有问题能够正常执行,问题是:
1)Proxy.newProxyInstance传入被代理对象(即实际对象)的类、接口和InvocationHandler的实现,返回代理对象,但是却不需要传入被代理对象本身,也就是说创建代理对象的时候不需要被代理对象本身的,各位猜猜看代理对象的var的值是多少呢?
2)接着上面问题,建代理对象的时候不需要被代理对象本身的,但是getJdkDynamicProxiedObject却能够传入代理对象,返回被代理对象,这是如何做到的呢?
我就不悬赏了,因为我身边JAVA做了快十年的这帮人竟然都说不清,爱好技术的大牛们,挑战本身就是悬赏了