一、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("张三");
}
}