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




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