InvocationHandler的invoke方法的第一个参数问题

简介:

今天有同事问起,动态代理中的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


相关文章
|
2月前
通过反射获取方法返回的类型
通过反射获取方法返回的类型
14 1
|
5月前
|
定位技术 C++ Python
C++一个函数返回两个或更多个返回值的方法
C++一个函数返回两个或更多个返回值的方法
Java基础方法返回值类型是void的情况
Java基础方法返回值类型是void的情况
java基础(一)数组作为方法参数和返回值
java基础(一)数组作为方法参数和返回值
java基础(一)数组作为方法参数和返回值
|
Java
Java中的方法的概念及无参、带参、带返回值方法定义和调用
方法的概念及无参、带参、带返回值方法定义和调用的简单示例
180 0
Java中的方法的概念及无参、带参、带返回值方法定义和调用
|
Java 索引
【Java】数组的常见操作以及数组作为方法参数和返回值
本期主要介绍数组的常见操作以及数组作为方法参数和返回值
208 0
【Java】数组的常见操作以及数组作为方法参数和返回值
|
测试技术 Android开发
怎么知道方法的参数有哪些类型呢?
怎么知道方法的参数有哪些类型呢?
181 0
|
Java 应用服务中间件 容器
getParameter()与 getAttribute()的用法与区别
getParameter()与 getAttribute()的用法与区别
213 0