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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈欢 中级黑马   /  2012-7-20 22:52  /  1834 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈欢 于 2012-7-20 22:53 编辑

import java.lang.reflect.InvocationHandler ;
import java.lang.reflect.Proxy ;
import java.lang.reflect.Method ;
interface Subject{
public String say(String name,int age) ; // 定义抽象方法say
}
class RealSubject implements Subject{ // 实现接口
public String say(String name,int age){
  return "姓名:" + name + ",年龄:" + age ;
}
};
class MyInvocationHandler implements InvocationHandler{
private Object obj ;
public Object bind(Object obj){
  this.obj = obj ; // 真实主题类
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this) ;//动态返回一个代理 }
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  Object temp = method.invoke(this.obj,args) ; // 调用方法
  return temp ;
}
};
public class DynaProxyDemo{
public static void main(String args[]){
  Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
  String info = sub.say("李李",24) ;
  System.out.println(info) ;
}

这段代码不明白,return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this) ;//动态返回一个代理
1这句中的动态返回代理是什么意思? 里面的this是什么意思?
2当sub.say()执行时之后执行哪段代码?
3invoke方法中为什么不会出现死循环?那个不是自己调用自己吗?


最近在学反射的基础,问题多多啊,还请高人指点,谢谢。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
interface Subject{
public String say(String name,int age) ; // 定义抽象方法say
}
class RealSubject implements Subject{ // 实现接口
public String say(String name,int age){
  return "姓名:" + name + ",年龄:" + age ;
}
};
class MyInvocationHandler implements InvocationHandler{
private Object obj ;  //new RealSubject()
public Object bind(Object obj){
  this.obj = obj ; // 真实主题类                                                                                //Subject
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);//动态返回一个代理
  }                                                                                                                                                         //this--new MyInvocationHandler()
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
        System.out.println("aaaaaaa");
  Object temp = method.invoke(this.obj,args) ; // 调用方法        this.obj
  return temp ;                                //this--new RealSubject()

}
};
public class DynaProxyDemo{
public static void main(String args[]){
  Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
  //Object sub = new MyInvocationHandler().bind(new RealSubject()) ;
  //System.out.println(sub.getClass().getName());
String info = sub.say("李李",24) ;
  System.out.println(info) ;
}
}


我在程序中this和其他方法所代表的对象进行了标记


1.Proxy可以用于创建动态代理类,MyInvocationHandler类中自定义了一个bind()方法
此方法调用了,Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h),这就会返回
一个动态代理类,this代表调用bind()方法的对象(MyInvocationHandler类的实例),也就是InvocationHandler的子类对象
2sub.say()之后会调用invoke(Object proxy,Method method,Object[] args)方法,sub传给 proxy,say传给method
其中的参数传给args,代理类中的方法在通过method.invoke()方法调用目标类中的方法(在目标类方法适当位置可添加争强语句)
3.method.invoke(this.obj,args) 调用的是目标类(不是代理类),this代表new RealSubject()
一定要明白:$proxy0是代理类,通过Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
对其进行了类型转换,目标类是RealSubject。


希望能帮你。。。




评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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