`

Java 代理

阅读更多

代理模式UML类图

 


代理模式
 

 

 

1. 静态代理

 

/**  
 * 为被代理的类提供一个接口,是为了提高代理的通用性,凡是实现了该接口的类,都可以被代理  
 * 这里其实就是运用了java面向对象的多态性  
 */  
public interface IHello {   
    public void sayHello();   
}   
/**  
 * 被代理的类,最根本的想法就是想用另外一个类来代理这个类,给这个类添加一些额外的东西  
 * 我们只需要创建另外一个类引用这个类就行了  
 */  
public class Hello implements IHello   
{   
    public void sayHello(){   
        System.out.println("被代理的方法");   
    }   
}  
/**  
 * 静态代理类,其实就是(被代理类的)接口的另外一种实现,  
 * 用来代替原来的被代理类  
 * @author qiuxy  
 */  
public class StaticProxy implements IHello { 
    IHello hello;   
    public StaticProxy(IHello hello) {   
        this.hello = hello;   
    }   
    /**  
     * 重新实现了sayHello()方法,这种实现其实就是在被代理类实现该方法中添加一些额外的东西, 以实现代理的作用  
*/  
    public void sayHello() {   
        System.out.println("在被代理的对象之前执行");   
        // 被代理的对象执行方法   
        hello.sayHello();   
        System.out.println("在被代理的对象之前执行");   
    }   
}  
/**  
 * 测试类  
 * @author qiuxy  
 */  
public class Test {   
    public static void main(String[] args) {   
        //产生一个被代理对象,只要实现了Ihello接口的对象,都可以成为被代理对象   
        //这里就是利用接口的好处,但这个也有局限性,就是只限于某种接口   
        IHello hello = new Hello();   
        //产生一个代理对象   
        StaticProxy sp = new StaticProxy(hello);   
        //执行代理对象的sayHello()方法,这个方法在被代理的方法前后添加了其他代码   
        sp.sayHello();   
    }   
}  

 

2. 动态代理

 

import java.lang.reflect.InvocationHandler;   
import java.lang.reflect.Method;   
/**  
 * 代理处理器,这个代理处理器实现了InvocationHandler这个接口,  
 * 这个接口的提供了一个invoke方法,并且传入三个参数(被代理的对象,被代理的方法,方法的参数数组)  
 * 这个invoke方法会在被代理的方法之前被调用  
 */  
public class MyProxyHandler implements InvocationHandler {   
    //被代理的对象   
    Object delegate;    
    //构造函数,在构在这个代理处理器时,传入要被代理的对象   
    public MyProxyHandler(Object delegate) {           this.delegate = delegate;   
    }   
    //被代理的方法之前会调用的方法   
    public Object invoke(Object proxy, Method method, Object[] args)   throws Throwable { 
        System.out.println("我在被代理的方法之前执行");   
        //被代理的方法开始执行   
        method.invoke(delegate, args);   
        System.out.println("我在被代理的方法之后执行");   
        return null;   
    }   
}  
import java.lang.reflect.Proxy;   
/**  
 * 测试类  
 */  
public class Test   
{   
    public static void main(String[] args)   
    {   
        Hello hello = new Hello();   
        //产生一个代理处理器对象   
        MyProxyHandler mph = new MyProxyHandler(hello);   
        //通过反射获得代理类,这里必须转换成代理类的接口类型   
        //这个代理对象其实是java动态生成一个被代理类的接口的另外一个实现类   
        IHello myProxy = (IHello)Proxy.newProxyInstance(hello.getClass().getClassLoader()  , hello.getClass().getInterfaces(), mph);   
        //代理类执行方法   
        myProxy.sayHello();   
    }   
  
}  

 

 

  • 大小: 16.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics