黑马程序员技术交流社区

标题: java反射机制问题 [打印本页]

作者: 陈欢    时间: 2012-7-20 22:52
标题: java反射机制问题
本帖最后由 陈欢 于 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方法中为什么不会出现死循环?那个不是自己调用自己吗?


最近在学反射的基础,问题多多啊,还请高人指点,谢谢。
作者: 王璐    时间: 2012-7-21 18:23
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。


希望能帮你。。。









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2