动态代理
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提交方式时没有乱码
动态代理类
extension
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
相关文章推荐
- 编程语言中的设计模式的原则
- Gephi可视化西游记人物关系图
- 面试题:找出数组中只出现一次的数字(二)
- nginx php 配置模板
- Java类加载的时机_4种主动引用会触犯类加载+剩下的被动引用不会触发类的加载
- 九度oj--题目1204:农夫、羊、菜和狼的故事(map 用结构体作key)
- NYOJ 171 聪明的kk
- 浅析性能测试培训总结-IP欺骗
- ural 1008 Image Encoding
- 按键的轮询
- 面试题:找出数组中只出现一次的数字
- 遍历迷宫
- Scala学习第八天 Scala主构造器、私有构造器、构造器重载实战详解
- getResource于getResourceAsStream的使用
- 浅析系统性能调优
- 什么会在main函数之前执行
- 使用栈模拟递归的算法
- 面试常见知识点
- 页面瀑布流布局的实现 javascript+css
- mysql查询表中的所有字段