Java代理與動態代理

一、簡單代理

代理類和被代理類實現相同的接口,具體代碼如下:

因爲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);
		}
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章