首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

静态代理跟动态代理

2013-11-09 
静态代理和动态代理本文内容1、静态代理示例及相关解释2、动态代理示例及相关解释一、静态代理示例及相关解释

静态代理和动态代理
本文内容
1、静态代理示例及相关解释2、动态代理示例及相关解释

一、静态代理示例及相关解释

public interface HelloWorld {void print(String message);void say(String message);}


public class HelloWorldImp implements HelloWorld{@Overridepublic void print(String message) {// TODO Auto-generated method stubSystem.out.println("Hello "+message);}@Overridepublic void say(String message) {// TODO Auto-generated method stubSystem.out.println("Say "+message);}}


public class StaticProxy implements HelloWorld{private HelloWorld helloWorld;public StaticProxy(HelloWorld helloWorld) {// TODO Auto-generated constructor stubthis.helloWorld = helloWorld;}@Overridepublic void print(String message) {// TODO Auto-generated method stubhelloWorld.print(message);}@Overridepublic void say(String message) {// TODO Auto-generated method stubhelloWorld.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)都用到了动态代理。

热点排行