设计模式-深入剖析动态代理模式(3)内部运作机制-通俗代码版

public interface Subject {

//业务操作

public void doSomething(String abc);

}

-----

public class RealSubject implements Subject {

//业务操作

public void doSomething(String str) {

System.out.println("do something!---->" + str);

}

}

----

public class MyInvocationHandler implements InvocationHandler {

//被代理的对象

private Object target = null;

//通过构造函数传递一个对象

public MyInvocationHandler(Object _obj){

this.target = _obj;

}

//代理方法

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

//设置返回值

Object result = null;

//前置通知

this.before();

//执行被代理的方法

result = method.invoke(this.target, args);

//后置通知

this.after();

//返回值

return result;

}

//前置通知

public void before(){

System.out.println("执行before方法");

}

//后置通知

public void after(){

System.out.println("执行after方法");

}

}

----

public class DynamicProxy {

//定义要代理哪个类

private Object obj =null;

//通过构造函数传递被代理对象

public DynamicProxy(Object _obj){

Class c = _obj.getClass();

//生成被代理类的代理类

this.obj = Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), new MyInvocationHandler(_obj));

}

//执行代理类的方法

public Object exec(String methodName,Object...args){

//返回值

Object result = null;

//方法中的参数类型

Class[] c= new Class[args.length];

int i=0;

//获得参数的类型

for(Object o:args){

c[i] = o.getClass();

i++;

}

try {

//根据方法名称和参数类型查找到唯一一个方法

Method method=this.obj.getClass().getMethod(methodName, c);

//执行该方法

result = method.invoke(this.obj, args);

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

}

-----

public class Client {

public static void main(String[] args) {

DynamicProxy proxy = new DynamicProxy(new RealSubject());

String[] str = {"1111"};

proxy.exec("doSomething",str);

}

}

时间: 2024-10-22 23:51:02

设计模式-深入剖析动态代理模式(3)内部运作机制-通俗代码版的相关文章

Android知识体系梳理笔记三:动态代理模式---插件加载机制学习笔记

静态代理模式 静态代理模式就是我们常说的代理设计模式,我们采用一个代理类调用原有的方法,且对产生的结果进行控制:举个例子:我们现在在玩一款网络游戏,需要打怪升级:太累就找个代理吧,一觉醒来就会发现我们已经当上CEO,迎娶白富美,天下第一了! 本来我们只能打怪,打怪-,但经过代理类增强,我们不仅可以打怪,还可以升级拿装备.就这样子了! 上代码: * 同一功能接口 public interface PlayNetGame { String beatMonster(); } 1 2 3 4 1 2 3

Java设计模式—Proxy动态代理模式

代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代理模式 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性.Java 动态代理机制以巧妙的方式近乎完

Android开发中无处不在的设计模式——动态代理模式

继续更新设计模式系列,写这个模式的主要原因是最近看到了动态代理的代码. 先来回顾一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式--Builder模式 - Android开发中无处不在的设计模式--观察者模式 - Android开发中无处不在的设计模式--原型模式 - Android开发中无处不在的设计模式--策略模式 动态代理模式在Java WEB中的应用简直是随处可见,尤其在Spring框架中大量的用到了动态代理:算是最重要

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye

设计模式之动态代理模式

设计模式之动态代理模式 代理模式: Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问).使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象.创建开销 大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能. 代理模式相关内容详见本人之前文章:http://www.cnblogs.com/zh

【转】设计模式(十一)代理模式Proxy(结构型)

设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一

重温设计模式(一)—代理模式

通过这次设计模式的交流,发现无论是技术上还是思想上需要提升的空间还有很多.收获比预期的要多的多.给我触动最深的就是以下几点: 1. 面向对象的精华:抽象.封装.继承.多态 2.设计模式六大原则的运用:单一职责.开闭原则.合成聚合.依赖倒装.里氏代换.迪米特 3.让自己思绪飞翔-大胆的去想象,只有去想了.做了,你才知道最后的结果 初次学习代理模式的博文:http://blog.csdn.net/gxq741718618/article/details/8781099 下面用另外一种愉快的心情了解一

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

设计模式(11)--代理模式之RMI

(1)确定变量和返回值是属于原语(primitive)类型或者可序列化的(Seriailizable)类型.原语类型 都实现了Seriailizable接口. (2)transient  关键字,告诉JVM不要序列化这个字段. 动态类下载(dynamic class downloading ) 代理模式 :控制对象的访问 代理模式有很多种.如:远程代理,虚拟代理.动态代理(保护代理) 客户调用本地的方法,本地的方法调用远程的方法. 本地方法就是"代理"."代理"处理