Java 代理

系统 1580 0

代理模式UML类图

 


Java 代理

代理模式
 

 

 

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();   
    }   
  
}  

  

 

 

Java 代理


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论