动态代理设计模式 Java
应用场景:不改变被代理对象的代码,新建动态代理类,并在代理类中增加相应的处理代码。
在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理设计模式: InvocationHandler
//doBefore(): 在代理调用被代理方法前执行
//doAfter(): 在代理类调用被代理方法后执行
public class Dyn {
/** 获取代理对象 */
public static IHelloWorld getHelloWoldProxy() {
IHelloWorld hello = new HelloWorld();
InvocationHandler handler = new DynHandler(hello);
ClassLoader cl = hello.getClass().getClassLoader();
IHelloWorld helloProxy = (IHelloWorld)Proxy.newProxyInstance(cl, new Class[]{IHelloWorld.class}, handler);
return helloProxy;
}
public static void main(String[] args) {
IHelloWorld proxy = getHelloWoldProxy();
//调用hi()之前,调用doBefore(),hi()运行之后,调用doAfter()
String c = proxy.hi("dog");
System.out.println(c);
}
}
class DynHandler implements InvocationHandler{
//被代理者
private Class cls = null;
//被代理的实例
private IHelloWorld obj = null;
//我要代理谁
public DynHandler(IHelloWorld obj){
this.obj = obj;
}
//调用被代理的方法
/**
* args: proxy.hi传进来的参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke() ..");
doBefore(args);
Object result = method.invoke(this.obj, args);
doAfter(args);
return result; //返回代理对象
}
public void doBefore(Object[] args){
System.out.println("doBefore() .." + (String)args[0]);
}
public void doAfter(Object[] args){
System.out.println("doAfter() ..");
}
}
//被代理类
class HelloWorld implements IHelloWorld{
public String hi(String name) {
System.out.println("hi() ..");
return "hello " + name;
}
}
//Exception in thread "main" java.lang.IllegalArgumentException: cn.util.HelloWorld is not an interface
interface IHelloWorld{
public String hi(String name);
}
//2.代理模式
public class DynamicPattern {
private Hello h;
public DynamicPattern(Hello h){
this.h=h;
}
public String sayHi(String name){
String str = h.hi(name);
System.out.println("sayHi() ..");
return str;
}
public static void main(String args[]){
DynamicPattern d = new DynamicPattern(new Hello());
String s = d.sayHi("jake");
System.out.println(s);
}
}
class Hello{
public String hi(String name) {
System.out.println("hi() ..");
return "hello " + name;
}
}