您的位置:首页 > 其它

初学动态代理

2016-03-15 16:23 218 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_19746547/article/details/50897514

最近在学习thrift,用到了动态代理,不是很明白,所以稍微学习了一下,记录一下。

package proxyDemo;

/**
* 我有一套房子,需要出售
* 接口类
* @author sheny
*
*/
public interface myHouseIface {
//出售方法
public void saleHouse();
}

package proxyDemo;

/**
* 出售房子实现类,即委托类
*
* @author sheny
*/
public class myHouseImpl implements myHouseIface {
public void saleHouse(){
System.out.println("现房出售,精装修......");
}
}
package proxyDemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* 中介类,我将房子交给中介帮我出售
* 中介就是代理类
* @author sheny
*
*/
public class Agency implements InvocationHandler{
//需要将我的房子交给中介,也就是代理类。
private Object myHouse = null;

/**
* 将房子委托给中介,他们会派出一个代理人来专门负责这个房屋的出售
*
* Proxy类:
* Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:
* public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
*  throws IllegalArgumentException
*  参数说明:
*  ClassLoader loader:类加载器
*  Class<?>[] interfaces:得到全部的接口
*  InvocationHandler h:得到InvocationHandler接口的子类实例
* @param realHouse
* @return
*/
public Object bindSale(Object realHouse){
this.myHouse = realHouse;
return Proxy.newProxyInstance(myHouse.getClass().getClassLoader(),
myHouse.getClass().getInterfaces(), this);
}

/**
* @param object    被代理的对象,就是指我
* @param saleHouse  要调用的方法
* @param param      调用方法需要传入的参数
*/
public Object invoke(Object object, Method saleHouse, Object[] param)
throws Throwable {
Object result = null;
System.out.println("卖房子前的一些准备工作");
result = saleHouse.invoke(myHouse, param);
System.out.println("卖房子后的一些收尾工作");
return result;
}

}
package proxyDemo;

public class myHouseMain {

public static void main(String[] args) {
//房屋接口的实例对象
myHouseIface myHouse = new myHouseImpl();
//取得代理对象,就是分配好了代理人
Agency agency = new Agency();
myHouseIface saleAgency = (myHouseIface) agency.bindSale(myHouse);
//开始卖房子,这时候不需要我去卖了,由代理人去负责出售
saleAgency.saleHouse();
/**
* 代理类的invoke()并没有被显示的调用,我的理解是:
* bindSale()返回了一个代理对象,就是我这个房子的代理中介,
* invoke()就相当是中介内部自己的流程,
* 当代理对象调用这个卖房子的方法saleHouse()时,就会自动的执行invoke(),也就是内部自己的流程。
*
* 不知道这样理解对不对??
*/

}
}


还有一些疑问,invoke()中传入的proxy有什么作用?

学习过程中还了解到Cglib动态代理,下次再整理。

这几天再根据实际项目总结一下动态代理。






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: