黑马程序员技术交流社区

标题: Java的动态代理迷惑 [打印本页]

作者: 李栋梁    时间: 2012-11-21 15:33
标题: Java的动态代理迷惑
//java的动态代理 Proxy.newProxyInstance()方法的几个参数到底是什么意思的?
public class Client
{
public static void main(String[] args)
{
  RealSubject realSubject = new RealSubject();
  
  
  Class<?> classType = realSubject.getClass();
  Subject subject = (Subject) Proxy.newProxyInstance(
    classType.getClassLoader(), new Class[] { Subject.class },
    new DynamicSubject(realSubject));
  subject.request();
  System.out.println(subject.getClass());
}
}

作者: 邵天强    时间: 2012-11-21 16:29
(1)loader:每个代理来都需要一个类装载器去加载这个代理类。
(2)interfaces:要想实现动态代理,被代理对象必须实现一个或多个接口,只有这样的类才能被代理,代理类要实现与被代理相同的接口
(3)h:生成的代理对象的方法里干什么事,例如,向进行进行权限管理、日志、事务等等,有开发人员编写handler接口的实现来指定。
例如:我们我们定义一个类Actor
public class Vector implements Person{
public void sing(){
System.out.println("演员唱歌");
}
public void dance(){
System.out.println("演员跳舞");
}
}
上面的类的功能不能满足我们的需求,我们需要加入系统的功能,就需要动态代理了
要动态代理,被代理对象必须实现接口
package com.heima.reflect;
public interface Person {
public abstract void sing();
public abstract void dance();
}
//需要一个目标类(被代理对象)
Vector v=new Vector();
//生成代理类
/**
   第一个参数:类加载器:一般用实现接口的类加载器
   第二个参数:代理类实现的接口(就是我们上面定义的Person了)
   第三个参数:我们生成的代理对象要干什么事。
*/
Proxy.newProxyInstance(v.getClass().getClassLoader(),v.getClass().getInfaces(),new InvocationHandler(){
        
  public Object invoke(Object proxy, Method method, Object[] args){
            //这里面就可以添加我们的系统功能了
  }

})





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