`
天高云淡000
  • 浏览: 55002 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

静态代理和动态代理

阅读更多
本文内容
  • 1、静态代理示例及相关解释
  • 2、动态代理示例及相关解释


一、静态代理示例及相关解释
public interface HelloWorld {
	
	void print(String message);
	void say(String message);

}


public class HelloWorldImp implements HelloWorld{

	@Override
	public void print(String message) {
		// TODO Auto-generated method stub
		System.out.println("Hello "+message);
		
	}

	@Override
	public void say(String message) {
		// TODO Auto-generated method stub
		System.out.println("Say "+message);
	}

}


public class StaticProxy implements HelloWorld{
	private HelloWorld helloWorld;
	
	public StaticProxy(HelloWorld helloWorld) {
		// TODO Auto-generated constructor stub
		this.helloWorld = helloWorld;
	}
	@Override
	public void print(String message) {
		// TODO Auto-generated method stub
		helloWorld.print(message);
	}

	@Override
	public void say(String message) {
		// TODO Auto-generated method stub
		helloWorld.say(message);
		
	}

}



public class Main {
	public static void main(String[] args) {
		HelloWorld helloWorld = new HelloWorldImp();
		StaticProxy staticProxy = new StaticProxy(helloWorld);
		staticProxy.print("world");
		staticProxy.say("world");
	}

}

一些相关解释:
代码中用StaticProxy类来代理HelloWorldImp来处理被代理类的逻辑。但是如果想要处理更多的逻辑呢?这时就要分别在HelloWorld HelloWorldImp以及StaticProxy中添加相应的方法。牵一发而动全身,设计存在一定缺陷。

二、动态代理示例及相关解释
/**
 * 实现了业务逻辑的分离  低耦合
 * @author Administrator
 *
 */
public class MyInvocationHandler implements InvocationHandler {
	// 要被代理的对象
	private Object object;

	/**
	 * 绑定要被代理额的对象,返回代理对象
	 * 
	 * @param object
	 * @return
	 */
	public Object bindRelation(Object object) {
		this.object = object;

		Object proxy = Proxy.newProxyInstance(object.getClass()
				.getClassLoader(), object.getClass().getInterfaces(), this);
		return proxy;
	}

	/**
	 * 当拦截这个类接口中的方法的时候被调用 一个过滤的作用 可以添加额外方法
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		// System.out.println("proxy:" + proxy.toString());

		System.out.println("事务开始");
		Object result = method.invoke(object, args);
		System.out.println("事务结束");
		return result;
	}

	public Object getObject() {
		return object;
	}

	public void setObject(Object object) {
		this.object = object;
	}

}


public class Main {
	public static void main(String[] args) {
		HelloWorld helloWorld = new HelloWorldImp();
		MyInvocationHandler invocationHandler = new MyInvocationHandler();
		HelloWorld proxy = (HelloWorld) invocationHandler
				.bindRelation(helloWorld);
		proxy.print("world");
		proxy.say("hello");
	}
}


一些解释:
动态代理主要的作用是对被代理对象调用的方法进行一次处理,在InvotionHandler中的invoke方法中处理。这样我们就可以在inoke中添加各种逻辑而不需要改变HelloWorld HelloWorldImp中的代码了。实现了低耦合。用途很广泛例如Spring中AOP对hibernate的事务处理,权限处理,远程方法调用(RMI)都用到了动态代理。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics