静态代理和动态代理

本文内容
[color=blue][size=medium][list]
[*]1、静态代理示例及相关解释
[*]2、动态代理示例及相关解释
[/list][/size][/color]

[color=red]一、静态代理示例及相关解释[/color]

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

}

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

/**
* 实现了业务逻辑的分离 低耦合
* @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");
}
}


[color=blue]一些解释:
动态代理主要的作用是对被代理对象调用的方法进行一次处理,在InvotionHandler中的invoke方法中处理。这样我们就可以在inoke中添加各种逻辑而不需要改变HelloWorld HelloWorldImp中的代码了。实现了低耦合。用途很广泛例如Spring中AOP对hibernate的事务处理,权限处理,远程方法调用(RMI)都用到了动态代理。[/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值