动态代理:即JAVA在运行时,动态的创建代理类。
使用动态代理,实现接口与实现类可以不直接发送联系,在运行期,实现动态的关联关系。
主要使用JAVA的反射技术,使用的接口InvocationHandler,代理类Proxy
具体实现的代码如下:
package com.mkf.pattern;
public interface InterfaceOne {
public void operation();
}
package com.mkf.pattern.impl;
import com.mkf.pattern.InterfaceOne;
public class Source implements InterfaceOne {
@Override
public void operation() {
System.out.println("源被调用:" + Source.class.getName());
}
}
package com.mkf.pattern.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxy implements InvocationHandler {
private Object sourceed;
public DynamicProxy(Object sourceed) {
super();
this.sourceed = sourceed;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代理对象" + proxy.getClass().getName());
Object result;
result = method.invoke(this.sourceed, args);
return result;
}
}
package com.mkf;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.mkf.pattern.InterfaceOne;
import com.mkf.pattern.impl.Source;
import com.mkf.pattern.proxy.DynamicProxy;
public class TestDynamicProxy {
/**
* @param args
*/
public static void main(String[] args) {
InterfaceOne io = new Source();
InvocationHandler iHandler = new DynamicProxy(io);
//获得代理对象
Class<?> clazz = Proxy.getProxyClass(io.getClass().getClassLoader(),
io.getClass().getInterfaces());
try {
Constructor<?> c = clazz.getConstructor(
new Class[]{InvocationHandler.class});
InterfaceOne ioOne = (InterfaceOne)c.newInstance(new Object[]{iHandler});
System.out.println("产生的动态代理对象 : " + ioOne.getClass().getName());
ioOne.operation();
} catch (Exception e) {
}
System.out.println("---------------------------------------------");
Object obj = Proxy.newProxyInstance(io.getClass().getClassLoader(),
io.getClass().getInterfaces(),
iHandler);
System.out.println("获得源对象: " + obj);
InterfaceOne ioOne = (InterfaceOne)obj;
System.out.println("---------------------------------------------");
ioOne.operation();
System.out.println("---------------------------------------------");
iHandler = Proxy.getInvocationHandler(obj);
System.out.println(iHandler.getClass().getName());
System.out.println(iHandler);
}
}
执行结果为:
产生的动态代理对象 : $Proxy0
代理对象$Proxy0
源被调用:com.mkf.pattern.impl.Source
---------------------------------------------
代理对象$Proxy0
获得源对象: com.mkf.pattern.impl.Source@10d448
---------------------------------------------
代理对象$Proxy0
源被调用:com.mkf.pattern.impl.Source
---------------------------------------------
com.mkf.pattern.proxy.DynamicProxy
com.mkf.pattern.proxy.DynamicProxy@e0e1c6