public interface Interface {
void doSomething();
void somethingElse(String arg);
}
public class RealObject implements Interface {
public void doSomething() {
System.out.println("RealObject.doSomething()");
}
public void somethingElse(String arg) {
System.out.println("RealObject.somethingElse("+arg+")");
}
}
public class RealObject implements Interface {
public void doSomething() {
System.out.println("RealObject.doSomething()");
}
public void somethingElse(String arg) {
System.out.println("RealObject.somethingElse("+arg+")");
}
}
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;
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {
System.out.println("***** \nproxy: " + proxy.getClass() +
",\nmethod:" + method + ",\nargs: " + args);
if(args != null) {
for(Object arg : args) {
System.out.println(" " + arg);
}
}
return method.invoke(proxied,args);
}
}
public class SimpleDynamicProxy {
public static void consumer( Interface iface ) {
iface.doSomething();
iface.somethingElse("bonobo");
}
public static void main(String[] args) {
RealObject ral = new RealObject();
consumer(ral);
System.out.println("------------------------");
Interface proxy = (Interface)Proxy.newProxyInstance
(Interface.class.getClassLoader(),
new Class[]{Interface.class},
new DynamicProxyHandler(ral));
consumer(proxy);
}
}
说明:通过调用静态方法 newProxyInstance() 可以创建动态代理,这个方法需要得到一个类加载器(你通常可以从已经被加载的对象中获取其类加载器),然后传递给它,
一个你希望该代理实现的接口列表(不是类或者抽象类),以及 InvocationHandler 接口的一个实现。
动态代理可以将所有调用重定向到调用处理器,因此通常会向调用处理器的构造器传递一个“实际”对象的引用,从而使得调用处理器在执行其中介任务时,可以将请求转发。
invoke() 方法中传递进来了代理对象,以防你需要区分请求的来源,但是在许多情况下,你并不关心这一点。然后,在invoke()内部,在代理上调用方法时需要格外当心,因为对接口的调用将被重定向为对代理的调用。