A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package cyc.dl;
  2. public interface Subject {  //定义接口
  3.      public String say(String name,int age ) ;
  4. }


  5. package cyc.dl;
  6. public class RealSubject implements Subject {  //实现接口
  7.     public String say(String name,int age){
  8.             return "姓名:" + name + "年龄:" + age ;
  9.     }
  10. }


  11. package cyc.dl;
  12. import java.lang.reflect.InvocationHandler;
  13. import java.lang.reflect.Method;
  14. import java.lang.reflect.Proxy;
  15. public class MyInvocationHandler implements InvocationHandler{ //代理类
  16.     private Object obj;   //定义一个真实主体  
  17.     public Object bind(Object obj){   //用一个方法绑定真实操作主体
  18.             this.obj = obj ;
  19.             return Proxy.newProxyInstance(obj.getClass().getClassLoader(), //类加载器   此语句什么作用,参数,this是啥
  20.           obj.getClass().getInterfaces(), this);  //取得代理对象
  21.     }
  22.     public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  23.             Object temp = method.invoke(this.obj, args) ;
  24.             return temp ;
  25.         }
  26. }

  27. package cyc.dl;
  28. public class DynaProxyDemo {    //测试类
  29. public static void main(String args[]){
  30.              MyInvocationHandler handler = new MyInvocationHandler() ;
  31.              Subject sub = (Subject)handler.bind(new RealSubject()) ;
  32.              String info = sub.say("阿菜", 21) ;
  33.              System.out.println(info);
  34.      }
  35. }
复制代码

代码虽然出来了,但是有些地方看不懂,帮忙解释一下??

1 个回复

倒序浏览
本帖最后由 anqi 于 2014-4-21 22:22 编辑
  1. public class MyInvocationHandler implements InvocationHandler{ //这不是代理类
  2.     private Object obj;
  3.     public Object bind(Object obj){   //用一个方法绑定真实操作主体
  4.             this.obj = obj ;
  5.             return Proxy.newProxyInstance(obj.getClass().getClassLoader(), //指定其类加载器
  6.           obj.getClass().getInterfaces(), this);  //this代表MyInvocationHandler
  7.     }
  8.     public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  9.             Object temp = method.invoke(this.obj, args) ;
  10.             return temp ;
  11.         }
  12. }
复制代码

  • Proxy才是代理 它利用newProxyInstance生成目标类的代理类,既然是生成了一个类,要加载进内存,所以要指定其类加载器一般指定和目标类一样的。obj.getClass().getClassLoader()
  • 代理是类对多个有相同方法的类的代理 所以要获得它们的接口 obj.getClass().getInterfaces()
  • MyInvocationHandler是代理类的处理方法,一个代理类怎么知道如何处理目标类的方法啊?计算机不知道,所以要认为设定一个处理方法的类,你调用代理类的方法,实际是调用MyInvocationHandler的对应方法,所以你要给它指定一个InvocationHandler(建立其子类)

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马