在正式开始动态代理模式的介绍之前,先同大家一起回顾一下代理。
那么如何理解代理呢?我们在程序中为了提供额外的或不同的操作,插入的用来代替实际对象的对象,通常充当着中间人的角色。
简单代理示例代码:
package com.tu.test.proxy;
public interface Interface {
void doSomething();
void somethingElse(String arg);
}
package com.tu.test.proxy;
public class RealObject implements Interface {
@Override
public void doSomething() {
System.out.println("doSomething....");
}
@Override
public void somethingElse(String arg) {
System.out.println("somethingElse..." + arg);
}
}
package com.tu.test.proxy;
public class SimpleProxy implements Interface {
private Interface proxied;
public SimpleProxy(Interface proxied) {
this.proxied = proxied;
}
@Override
public void doSomething() {
System.out.println("SimpleProxy doSomething...");
proxied.doSomething();
}
@Override
public void somethingElse(String arg) {
System.out.println("SimpleProxy somethingElse..." + arg);
proxied.somethingElse(arg);
}
}
package com.tu.test.proxy;
public class SimpleProxyDemo {
public static void consumer(Interface iface){
iface.doSomething();
iface.somethingElse("proxy");
}
public static void main(String[] args) {
consumer(new RealObject());
consumer(new SimpleProxy(new RealObject()));
}
}
认识了简单代理,现在开始认识动态代理!
动态代理就是动态地创建代理并动态地处理对所代理方法的调用。
使用了动态代理,所有调用都会被重定向到一个单一的调用处理器(一个实现InvocationHandler接口的类)上。
说太多没多大意思,结合具体示例代码来理解。
package com.tu.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler {
private Object proxied;//要被代理的对象
public DynamicProxyHandler(Object proxied) {
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("proxy:" + proxy.getClass() + ",method:" + method + ",args:" + args);
if (args != null) {
for (Object arg : args) {
System.out.println(" " + arg);
}
}
//执行method.invoke方法之前可以进行方法的过滤,判断method.getName()
return method.invoke(proxied, args);
}
}
package com.tu.test.proxy;
import java.lang.reflect.Proxy;
public class SimpleDynamicProxy {
public static void consumer(Interface iface){
iface.doSomething();
iface.somethingElse("proxy");
}
public static void main(String[] args) {
RealObject real = new RealObject();
consumer(real);
//insert a proxy and call method again
/**
* 创建一个动态代理:Proxy.newProxyInstance(参数1:通过一个已经加载的对象获取类加载器,参数2:该代理实现的接口列表,参数3:单一的调用处理器InvocationHandler)
* **/
consumer((Interface)Proxy.newProxyInstance(Interface.class.getClassLoader(), new Class[]{Interface.class}, new DynamicProxyHandler(real)));;
}
}