[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();
}
}
}
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();
}
}
}