java代理(三、动态代理源码)

一、Bank.java

package com.osiit.myproxy.dynamic_proxy;

/**
 * 真实角色和代理角色共同的接口
 * @author Michael 2010-10-31
 * email: kyitzdb@126.com
 */

public abstract interface Bank {
 /**
  * 银行有存钱的业务方法
  */
 public abstract void saveMoney(String name);
}


二、Depositor.java

package com.osiit.myproxy.dynamic_proxy;

/**
 * 这个是作为储户的你,是真实角色 最终享受到钱存入账户的对象享受者
 * @author Michael 2010-10-31
 * email: kyitzdb@126.com
 */
public class Depositor implements Bank {

 public void saveMoney(String name) {
  // 储户想要存钱,但是需要柜台的操作人员代理他存储到自己的账户上
  // 此方法要等待代理对象帮其来完成
  System.out.println(name+"储户存钱");
 }
}

三、BankOperator.java

package com.osiit.myproxy.dynamic_proxy;

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

/**
 * 写此类的目的有两个
 * 1.告诉动态代理类去生成什么样的类结构,让动态代理类生成的时候知道实现的接口是谁
 * 2.让生成的动态代理类的指定方法被调用。
 * @author Michael 2010-10-31
 * email: kyitzdb@126.com
 */
public class BankOperator implements InvocationHandler {
 /** 被代理的对象的引用,真实角色 */
 private Object object;

 /**
  * 给真实角色对象赋值
  *
  * @param object 被代理的真实角色对象
  */
 public void setObject(Object object) {
  this.object = object;
 }

 /**
  * @param proxy
  *            动态代理类对象引用
  * @param method
  *            动态代理类的方法
  * @param args
  *            方法的参数
  */
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  countMoney();
  //调用动态代理类的方法,并把被代理类的引用传递给代理类
  method.invoke(object, args);
  printBill();
  return null;
 }

 /**
  * 数钱的方法,柜台操作员可以在存入钱之前先数一数来核实钱数
  */
 public void countMoney() {
  System.out.println("数钱");
 }

 /**
  * 在存入钱成功后打印回执单
  */
 public void printBill() {
  System.out.println("打印回单");
 }
}
四、Client.java

package com.osiit.myproxy.dynamic_proxy;

import java.lang.reflect.Proxy;

/**
 * 执行这次存钱业务的类
 * @author Michael 2010-10-31
 * email: kyitzdb@126.com
 */
public class Client {
 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
  Class cs = Class.forName("com.osiit.myproxy.dynamic_proxy.Depositor");
  //真实对象
  Object depositor = cs.newInstance();
  //动态产生代理对象的管理者
  BankOperator invocation = new BankOperator();
  invocation.setObject(depositor);
  //将运行时的类,通过Class类进行加载,返回Class实例
  Class c = depositor.getClass();
  
  //根据动态代理对象产生的代理对象
  //注意这里一定要强制转换为接口类型
  //根据静态代理的经验,产生的代理对象实质上是和真实对象实现了同一个接口的类,并不属于同一个数据类型
  Bank depositorProxy = (Bank)Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), invocation);
  depositorProxy.saveMoney("张三");
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值