java动态代理学习

感谢博主:http://blog.csdn.net/hp910315/article/details/51199748 

在安卓开发中我基本上没有自己写过代理,大概只有架构师才能用到吧. 这是一篇学习理解的博客,在学习一个新事物之前要问两个为什么?

1.什么是代理

2.代理能帮我们做什么


代理在现实生活中,应该类似于中介机构吧,代理是可以为客户提供一系列的服务的机构.

这里有这样一个需求:小明十个踏实勤奋的孩子,平时工作比较忙,每次申请出差后,都没时间买车票和报销车费(这里是假设),这时候有一家中介机构叫德仁(最近猎场比较火),专门为客户提供各种服务,包括跑腿买票报销.


下面我们用代码实现这个业务场景:

1.创建小明公司Company接口(为什么要创建这个接口,因为小明公司有很多人,都要实现这个接口,便于管理)

/**
 * 小明的公司
 * @author Administrator
 */
public interface Company {
	
	/**
	 * 申请出差
	 */
	public void application();
	
	/**
	 * 审批通过
	 */
	public void approval();
	
}

2.创建小明(有点意思)XiaoMIng类并实现Company接口

public class XiaoMing implements Company{

	@Override
	public void application() {
		System.out.println("小明申请出差");
	}

	@Override
	public void approval() {
		System.out.println("小明申请出差获得批准");
		 request();
	}
	
	/**
	 * 小明的需求需要有人买车票,然后报销
	 */
	public void request() {
		System.out.println("小明需要有人给买车票和报销车费");
	}
	

3.创建一家德仁的公司 DeRenAgency类并且实现InvocationHandler接口(java api自带的接口)

在invoke接口中判断只有客户出差获得批准后才为客户提供买票服务

//Invocation 调用
public class DeRenAgency implements InvocationHandler{
	private Object customer;
	public DeRenAgency (){};
	
	public DeRenAgency (Object customer){
		this.customer = customer;
	};
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		//只有审批通过后才进行服务
		if(method.getName().equals("approval")) {
			Object obj = method.invoke(customer, args);
			//一家叫德仁的代理机构了解客户的需求后
			System.out.println("代理:为客户买车票以及报销费用");
			System.out.println("***************************");
			return obj;
		}
		return null;
	}

4.调用这里使用到了Proxy(java api自带的类)通过newProxyInstance 和DeRenAgency 方法获取小明对象(这里是类的向上转型),调用小明的审批通过方法打印日志:

小明申请出差获得批准
小明需要有人给买车票和报销车费
代理:为客户买车票以及报销费用
***************************

public class Mian {
	public static void main(String [] args) {
		DeRenAgency deRenAgency = new DeRenAgency(new XiaoMing());
		Company reimbursement = (Company) Proxy.newProxyInstance(Company.class.getClassLoader(), 
				new Class[]{Company.class}, deRenAgency);
		
		reimbursement.application();//申请
		reimbursement.approval();//审批通过
	}
}

至此动态代理阶段实现







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值