动态代理

作用:不改变源码的基础上对已有方法进行增强,他是AOP思想的实现技术,它分为两类:一类是基于接口的,另一个是基于子类的,这两种都有各自的应用场景,如dbcp就是用的是动态代理,c3p0就是使用静态代理装饰者模式。

以下是代码:

定义接口

public interface IAction {
public void comnActor(Float money);
public void dangerActor(Float money);

}

接口实现类

public class ActorImpl implements IAction {

@Override
public void comnActor(Float money) {
// TODO Auto-generated method stub
System.out.println("普通表演:"+money);
}

@Override
public void dangerActor(Float money) {
// TODO Auto-generated method stub
System.out.println("危险表演:"+money);
}

}

代理类:

public class ProxyAgent {
@Test
public void fun(){
//actor.comnActor();
final ActorImpl actor = new ActorImpl();
IAction actorProxy = (IAction) Proxy.newProxyInstance(actor.getClass().getClassLoader(),
actor.getClass().getInterfaces(),
new InvocationHandler() {

Object retValue = null;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Float money = (Float) args[0];
if(method.getName().equals("comnActor")){
if(money>10000){
retValue = method.invoke(actor, money/2);
}
}if(method.getName().equals("dangerActor")){
if(money>50000){
retValue = method.invoke(actor, money/2);
}
}
return retValue;
}
});
actorProxy.comnActor((float) 20000.00);
actorProxy.dangerActor((float) 60000.00);
}
}

原文地址:https://www.cnblogs.com/niuyg928/p/10921720.html