//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");
}
}
------解决方案--------------------
不好意思,上面我说错了,其实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)