当前位置: 代码迷 >> J2SE >> [基础] java动态代理,求解释解决方案
  详细解决方案

[基础] java动态代理,求解释解决方案

热度:594   发布时间:2016-04-23 20:22:06.0
[基础] java动态代理,求解释

//fileName: DynamicProxyHandler.java
package dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler {
private Object proxied;
public DynamicProxyHandler(Object proxied) {
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println("proxy.hashCode:" + proxy.hashCode());     // StackOverFlowError
System.out.println("Begin Proxy:" + this);
Object ret = method.invoke(proxied, args);
// Object ret = method.invoke(proxy, args); //!!! Why error ???
System.out.println("End Proxy:" + this);
return ret;
}
}


其中,
Object ret = method.invoke(proxied, args);
一句为什么不能使用
Object ret = method.invoke(proxy, args);

其它文件下如:

//fileName: MyInterface.java
package dynamicProxy;

public interface MyInterface {
void doSth();
void doSthElse(String arg);
}





//fileName: MyCls.java
package dynamicProxy;

public class MyCls implements MyInterface {

@Override
public void doSth() {
System.out.println("MyCls is doing sth.");
}

@Override
public void doSthElse(String arg) {
System.out.println("MyCls is doing sth else:" + arg);
}

}



//fileName:Client.java
package dynamicProxy;

import java.lang.reflect.Proxy;

public class Client {

public static void main(String[] args) {
MyInterface obj = new MyCls();
obj.doSth();
obj.doSthElse("Hello");

System.out.println("--------------");

DynamicProxyHandler handler = new DynamicProxyHandler(obj);
MyInterface objProxied = (MyInterface)Proxy.newProxyInstance(
MyInterface.class.getClassLoader(), 
new Class[] { MyInterface.class },
handler);
objProxied.doSth();
System.out.println("--------------");
objProxied.doSthElse("Hello");
}

}


------解决方案--------------------
引用:
Quote: 引用:

Object ret = method.invoke(proxy, args);
这个proxy实际类型上是DynamicProxyHandler,而proxied类型是MyCls
如果这样的写的话,逻辑上就不对了,而且是递归调用

朋友,“这个proxy实际类型上是DynamicProxyHandler” 依据是啥?
我调试发现是:
proxy  $Proxy0(id=20)
    h  DynamicProxyHandler
         proxied MyCls
感觉也是合理的。
另外,既然这个参数不能用,那它存在的意义是啥?



不好意思,上面我说错了,其实proxy的类型为$Proxy0
这个代码的源码
public final class $Proxy0 extends Proxy
  implements MyInterface
{
  private static Method m1;
  private static Method m3;
  private static Method m4;
  private static Method m0;
  private static Method m2;

  public $Proxy11(InvocationHandler paramInvocationHandler)
    throws 
  {
    super(paramInvocationHandler);
  }

  public final boolean equals(Object paramObject)
    throws 
  {
    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 doSth()
    throws 
  {
    try
    {
      this.h.invoke(this, m3, null);
      return;
    }
    catch (Error
------解决方案--------------------
RuntimeException localError)
    {
      throw localError;
    }
    catch (Throwable localThrowable)
  相关解决方案