一、簡單代理
代理類和被代理類實現相同的接口,具體代碼如下:
因爲consumer()接收的是Inerface,所以無法知道正常獲得的是RealObject還是SimpleProxy,因爲它們都實現了Interface。
SimpleProxy內部會調用RealObject,所以它會執行和RealObject上相同的方法。
接口類
package Resource.Proxy;
public interface Interface {
void doSomething();
void somethingElse(String arg);
}
被代理類
package Resource.Proxy;
public class RealObject implements Interface {
public void doSomething() {
System.out.println();
}
public void somethingElse(String arg) {
System.out.println("somethingElse"+arg);
}
}
package Resource.Proxy;
public class SimpleProxy implements Interface {
private Interface proxied;
public SimpleProxy(Interface proxied) {
this.proxied = proxied;
}
public void doSomething() {
System.out.println("SimpleProxy doSomething");
proxied.doSomething();
}
public void somethingElse(String arg) {
System.out.println("SimpleProxy somethingElse" + arg);
proxied.somethingElse(arg);
}
}
測試類
package Resource.Proxy;
public class SimpleProxyDemo {
public static void main(String[] args) {
consumer(new RealObject());
consumer(new SimpleProxy(new RealObject()));
}
public static void consumer(Interface iface) {
iface.doSomething();
iface.somethingElse("hello world");
}
}
測試結果somethingElsehello world
SimpleProxy doSomething
SimpleProxy somethingElsehello world
somethingElsehello world
二、動態代理
代碼如下:
package Resource.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
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("***proxy:"+proxy.getClass()+".method: "+method+
". args"+args);
if(args!=null)
for(Object arg:args)
System.out.println(" "+arg);
return method.invoke(proxied, args);
}
static class SimpleDynamicProxy{
public static void consumer(Interface iface){
iface.doSomething();
iface.somethingElse(" bonabo");
}
public static void main(String[] args){
RealObject real=new RealObject();
Interface proxy=(Interface)Proxy.newProxyInstance(
Interface.class.getClassLoader(),
new Class[]{Interface.class},
new DynamicProxyHandler(real));
consumer(proxy);
}
}
}