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 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?