annunaki 2016-01-15 14:15 采纳率: 0%
浏览 3018

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 2016-01-15 15:56
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办