您的位置:首页 > 其它

动态代理

2015-08-27 22:36 267 查看
what

Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。 )

why

横切面编程, 在不改变我们已有代码结构的情况下增强或控制对象的行为

how

被代理的接口类

public interface IGamePlayer {
//登录游戏
public void login( String user, String password) ;
//杀怪, 网络游戏的主要特色
public void killBoss( ) ;
//升级
public void upgrade( ) ;
}被代理的真实类
public class GamePlayer implements IGamePlayer {
private String name = "" ;
//通过构造函数传递名称
public GamePlayer( String name) {
this.name = name;
}
//打怪, 最期望的就是杀老怪
public void killBoss( ) {
System.out.println( this. name + "在打怪! " ) ;
}
//进游戏之前你肯定要登录吧, 这是一个必要条件
public void login( String user, String password) {
System.out.println( "登录名为" +user+"的用户" +this. name+"登录成功! " ) ;
}
//升级, 升级有很多方法, 花钱买是一种, 做任务也是一种
public void upgrade( ) {
System.out.println( this. name + " 又升了一级! " ) ;
}
}

动态代理的Handler类

public class MyInvocationHandler implements InvocationHandler {
//被代理的实例
Object obj = null;
//我要代理谁
public GamePlayIH( Object obj ) {
this.obj = obj;
}
//调用被代理的方法
public Object invoke( Object proxy, Method method, Object[ ] args) throws Throwable {
Obj ect result = method.invoke( this.obj, args) ;
//如果是登录方法, 则发送信息
if( method.getName( ).equalsIgnoreCase( "login" )) {
System. out. println( "有人在用我的账号登录! " ) ;
}
return result;
}
}
可以在invoke方法中增强被代理对象的特地方法
method.getName().equals("xx")时则

比如:可以在tomcat的过滤器中对request的getParameter()增强使之在get提交方式时没有乱码

动态代理类
public class DynamicProxy<T> {
public static <T> T newProxyInstance( ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) {
//寻找JoinPoint连接点, AOP框架使用元数据定义
if( true) {
//执行一个前置通知
( new BeforeAdvice( )).exec() ;
}
//执行目 标, 并返回结果
return ( T) Proxy.newProxyInstance(loader, interfaces, h) ;
}
}
通知接口及实现

public interface IAdvice {
//通知只有一个方法, 执行即可
public void exec();
}
public class BeforeAdvice implements IAdvice{
public void exec() {
System.out.println( "我是前置通知, 我被执行了! " ) ;
}
}
动态代理的场景类
public class Client {
public static void main( String[] args) {
//定义一个主题
IGamePlayer   iGamePlayer  = new IGamePlayer("张三") ;
//定义一个Handler
InvocationHandler handler = new MyInvocationHandler(iGamePlayer) ;
//定义主题的代理
IGamePlayer proxy = DynamicProxy. newProxyInstance(iGamePlayer.getClass().getClassLoader(), iGamePlayer.getClass().getInterfaces(), handler) ;
//代理的行为
proxy.killBoss();
}
}

extension
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: