代理模式_动态代理

[size=18][b]设计模式之动态代理[/b][/size]


http://hi.baidu.com/orris/blog/item/b8d4783e27a5c63d71cf6c0b.html


接口类:

public interface InterfaceObj {

public abstract void request();
public abstract String send();
}

目标类:

public class TargetObj implements InterfaceObj{

public TargetObj(){}

public void request()
{
System.out.println("this is a TargetObj's request");
}
public String send()
{
System.out.println("this is a TargetObj's send");
return "a return obj";
}
}

动态代理类:

必须实现InvocationHandler接口

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

public class DynamicProxy implements InvocationHandler{

private Object obj = null;

public DynamicProxy(){}

//构造方法赋值
public DynamicProxy(Object obj)
{
this.obj = obj;
}

//set方法赋值
public void setObject(Object obj)
{
this.obj = obj;
}

public Object invoke(Object proxyObj,Method method,Object[] methodParam) throws Throwable
{
this.beforeRequest();
try
{

proxyObj = method.invoke(obj , methodParam);

}catch(Exception ex)
{
ex.printStackTrace();
}
this.afterRequest();
return proxyObj;
}

public void beforeRequest()
{
System.out.println("before Request!!!");
}

public void afterRequest()
{
System.out.println("after Request!!!");
}
}


测试类:


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;

public class Test {

public static void main(String[] args) {
TargetObj targetObj = new TargetObj();//初始化被代理类
InvocationHandler inhandler = new DynamicProxy(targetObj);//初始化代理类
Class targetClass = targetObj.getClass();

//以下是一次性生成
/*
InterfaceObj io = (InterfaceObj)Proxy.newProxyInstance(targetClass.getClassLoader(), targetClass.getInterfaces(),inhandler );
io.request();
*/

//以下是分解步骤

Class c = Proxy.getProxyClass(targetClass.getClassLoader(), targetClass.getInterfaces()) ;
try {
Constructor constr = c.getConstructor(new Class[]{InvocationHandler.class});
InterfaceObj iobj = (InterfaceObj)constr.newInstance(new Object[]{inhandler});
iobj.request();
System.out.println("\n");
String returnObj = (String)iobj.send();
System.err.println("return:"+returnObj);
System.err.println(Proxy.isProxyClass(c)+"-"+Proxy.isProxyClass(inhandler.getClass()));
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值