62,614
社区成员
发帖
与我相关
我的任务
分享
//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;
}
}
//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");
}
}
Class<?> c = proxy.getClass();
Method[] methods = c.getDeclaredMethods();
for(Method m : methods) {
System.out.println(m.getName());
}
这里我们可以获得代理对象的所有的方法的名字
为什么getClass()方法不会进入死循环呢?
因为getClass()方法是final的,不可以被覆盖,所以就不能被代理public $Proxy11(InvocationHandler paramInvocationHandler)
也应该是
public $Proxy0(InvocationHandler paramInvocationHandler)
没贴好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)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final void doSthElse(String paramString)
throws
{
try
{
this.h.invoke(this, m4, new Object[] { paramString });
return;
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final int hashCode()
throws
{
try
{
return ((Integer)this.h.invoke(this, m0, null)).intValue();
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
public final String toString()
throws
{
try
{
return (String)this.h.invoke(this, m2, null);
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
static
{
try
{
m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });
m3 = Class.forName("dynamicProxy.MyInterface").getMethod("doSth", new Class[0]);
m4 = Class.forName("dynamicProxy.MyInterface").getMethod("doSthElse", new Class[] { Class.forName("java.lang.String") });
m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
return;
}
catch (NoSuchMethodException localNoSuchMethodException)
{
throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
}
catch (ClassNotFoundException localClassNotFoundException)
{
throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
}
}
}
然后看这个方法
public final void doSth()
throws
{
try
{
this.h.invoke(this, m3, null);
return;
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
this.h.invoke(this, m3, null);
1、这个参数其实在这个方法中用到了this
2、所以如果这样调用的时候就不断循环了
method.invoke(proxy, args);,不知道说的还明白?