java 代理

import java.lang.reflect.InvocationHandler;  
 import java.lang.reflect.Proxy;  
 import java.lang.reflect.Method;  
 //抽象角色:java动态代理的实现目前只支持接口,不支持抽象类  
 interface BusinessFoo  
 {  
     void foo();  
 }  
 interface BusinessBar  
{  
    String bar(String message);  
}  
//真实角色:真正实现业务逻辑方法  
class BusinessFooImpl implements BusinessFoo  
{  
    public void foo()  
    {  
        System.out.println("BusinessFooImpl.foo()");  
    }  
}  
class BusinessBarImpl implements BusinessBar  
{  
    public String bar(String message)  
    {  
        System.out.println("BusinessBarImpl.bar()");  
        return message;  
    }  
}  
//动态角色:动态生成代理类  
//每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler
class BusinessImplProxy implements InvocationHandler  
{  
    private Object obj;  
    BusinessImplProxy() {  
    }  
    BusinessImplProxy(Object obj) {  
        this.obj = obj;  
    }  
    public Object invoke(Object proxy,Method method,Object[] args) throws Throwable  
    {  
        Object result = null;  
        doBefore();  
        result = method.invoke(obj,args);  
        doAfter();  
        return result;  
    }  
    public void doBefore(){  
        System.out.println("do something before Business Logic");  
    }  
    public void doAfter(){  
        System.out.println("do something after Business Logic");  
    }  
    public static Object factory(Object obj)  
    {  
        Class cls = obj.getClass();  
        //一个实现在创建类时在运行时指定的接口列表的类
        return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));  
    }  
}  
//测试类  
public class prixy {

 /**
  * @param args
  *
  * 所谓Dynamic Proxy是这样一种class:
它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。
 当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //理角色所代表的真实对象,是我们最终要引用的对象
   BusinessFooImpl bfoo = new BusinessFooImpl();  
   //BusinessFoo 抽象角色  声明真实对象和代理对象的共同接口
         BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo); //代理角色,起抽象角色与真实角色的中间作用
         bf.foo();  
         System.out.println();  
           
         BusinessBarImpl bbar = new BusinessBarImpl();  
        
         BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);  
         String message = bb.bar("Hello,World");  
         System.out.println(message);  
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值