2 annunaki annunaki 于 2016.01.15 22:15 提问

JDK动态代理的问题,看似简单,居然很多高手回答不了!大家来看看吧

用过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做了快十年的这帮人竟然都说不清,爱好技术的大牛们,挑战本身就是悬赏了

2个回答

devmiao
devmiao   Ds   Rxr 2016.01.15 23:56
xunzaosiyecao
xunzaosiyecao   2016.09.21 23:07
Csdn user default icon
上传中...
上传图片
插入图片