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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值