更新时间:2022-09-17 17:02:15
今天有同事问起,动态代理中的InvocationHandler的invoke方法的第一个参数。是代理类还是委托类(即被代理类). 其实这个参数是代理类。我们看一下生成的代理类就会明白:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public interface ProxyInf {
public void say();
} public class TestProxy{
public void say() {
System.out.println( "nothing" );
}
public static void main(String args[]) throws IOException{
byte [] generateProxyClass = ProxyGenerator.generateProxyClass(
"ProxyImpl" , new Class<?>[] { ProxyInf. class });
FileOutputStream fos = new FileOutputStream( "c:\\ProxyImpl.class" );
fos.write(generateProxyClass);
fos.close();
}
} |
反编译C盘下面的ProxyImpl.class类文件,你会发现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public final class ProxyImpl extends Proxy
implements ProxyInf
{ private static Method m3;
private static Method m1;
private static Method m0;
private static Method m2;
public ProxyImpl(InvocationHandler paramInvocationHandler)
throws {
super (paramInvocationHandler);
}
public final void say()
throws {
try {
this .h.invoke( this , m3, null );
return ;
}
catch (RuntimeException localRuntimeException) {
throw localRuntimeException;
}
catch (Throwable localThrowable){
}
throw new UndeclaredThrowableException(localThrowable);
}
... } |
当你调用代理类的say方时,他调用的是InvokeHandler的invoke方法,并把自个做首参传了进去。
就这样吧.
本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/1221281