- 浏览: 2013290 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。
“委托”在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!代码如下:
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- /*
- * @author Liusheng
- * 实现“委托”模式,用户需要实现InvocationHandler接口;
- * 参考:http://www.uml.org.cn/j2ee/200411036.htm
- */
- public abstract class Delegator implements InvocationHandler {
- //RelegateTo针对每个对象都要生成一个实例,因而非Static的log,代价比较高。
- //protected Log _log = LogFactory.getLog(this.getClass());
- //private static Log _log = LogFactory.getLog(RelegateTo.class);
- //--------------------------------------------
- protected Object obj_orgin = null; //原始对象
- protected Object obj_proxy = null; //代理对象
- //--------------------------------------------
- public Delegator() {
- //空
- }
- public Delegator(Object orgin){
- this.createProxy(orgin);
- }
- //--------------------------------------------
- protected Object createProxy(Object orgin) {
- obj_orgin = orgin;
- obj_proxy = Proxy.newProxyInstance(
- orgin.getClass().getClassLoader(), //加载器
- orgin.getClass().getInterfaces(), //接口集
- this); //委托
- //_log.debug("# 委托代理:"+obj_proxy);
- return obj_proxy;
- }
- protected Object invokeSuper(Method method, Object[] args)
- throws Throwable {
- return method.invoke(obj_orgin, args);
- }
- //--------------实现InvocationHandler接口,要求覆盖------------
- public Object invoke(Object obj, Method method, Object[] args)
- throws Throwable {
- // 缺省实现:委托给obj_orgin完成对应的操作
- if (method.getName().equals("toString")) { //对其做额外处理
- return this.invokeSuper(method, args)+"$Proxy";
- }else { //注意,调用原始对象的方法,而不是代理的(obj==obj_proxy)
- return this.invokeSuper(method, args);
- }
- }
- }
下面的代码,则是作为一个委托的例子,实现Map的功能。
- import java.io.IOException;
- import java.lang.reflect.Method;
- import java.util.Hashtable;
- import java.util.Map;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import com.bs2.core.UtilLog;
- /**
- * @author Liusheng
- * 本代码主要用于演示RelegateTo的使用方法
- */
- public class Delegator4Map extends Delegator {
- private static Log _log = LogFactory.getLog(Delegator4Map.class);
- private Map orginClass = null; //原始对象
- private Map proxyClass = null; //代理对象
- public Map getOrgin() { return orginClass; }
- public Map getProxy() { return proxyClass; }
- public Delegator4Map(Map orgin) {
- super(orgin);
- orginClass = orgin;
- proxyClass = (Map)super.obj_proxy;
- }
- public Object invoke(Object obj, Method method, Object[] args)
- throws Throwable {
- if (method.getName().equals("size")) { //修改close处理逻辑
- _log.debug("原始 size()="+super.invoke(obj, method, args));
- Object res2 = new Integer(-1);
- _log.debug("修改 size()="+res2);
- return res2;
- }else {
- return super.invoke(obj, method, args);
- }
- }
- public static void main(String[] args) throws IOException {
- UtilLog.configureClassPath("resources/log4j.properties", false);
- Delegator4Map rtm = new Delegator4Map(new Hashtable());
- Map m = rtm.getProxy();
- m.size();
- _log.debug("代理:"+m.toString());
- }
- }
注意:UtilLog仅仅是用于配置log4j属性文件位置,如果log4j.properties就在缺省的运行路径下,则无需单独配置。或者用System.out输出来替代_log输出。
发表评论
-
流式计算
2022-02-07 14:31 226private void postHandle(List& ... -
消息队列使用的四种场景介绍
2018-08-09 16:34 2397以下介绍消息队列在实际应用中常用的使用场 ... -
设计模式
2018-04-11 16:49 9281.桥梁模式,将抽象部分与实现部分隔离开,抽象部分持有实现 ... -
Spring boot web可以访问Service和Mapper层
2018-03-26 16:42 2789Spring boot的web层可以访问Service层,然 ... -
FreeMarker的基础语法使用 && 心得和技巧
2018-01-10 10:03 1917FreeMarker是一个模板引 ... -
webService----wss4j+cxf实现WS-Security(基于UsernameToken)
2017-10-23 18:58 1497分享一下wss4j+cxf基于UsernameToken的安 ... -
Spring MVC之LocaleResolver(解析用户区域)
2017-09-23 15:55 2434为了让web应用程序支持国际化,必须识别每个用户的首选区域, ... -
(转)java泛型
2016-11-12 20:29 1585http://www.cnblogs.com/lwbqqyu ... -
java中如何忽略字符串中的转义字符--转载
2016-06-28 16:42 9790原文地址:http://my ... -
(转)关于JAP FetchType.LAZY(hibernate实现)的理解 .
2016-04-27 15:22 5032JPA定义实体之间的关系有如下几种: @OneToOne ... -
(转)hibernate annotation注解方式来处理映射关系
2016-04-26 16:52 1785http://www.cnblogs.com/xiao ... -
代码片段,导出的文件头
2015-11-18 20:34 1552public static void setDownload ... -
(转)为什么要两次调用encodeURI来解决乱码问题
2015-08-03 20:19 2419地址:http://blog.csdn.net/howla ... -
杀死进程
2015-07-21 14:54 1228sudo lsof -i :9000 COMMAND P ... -
批处理batch,执行多个SQL语句
2015-07-15 19:21 10533批处理batch,执行多个SQL语句。 ... -
中文乱码解决的4种方式
2015-07-03 14:20 2572目前收集到4中方法,中文传参一documentPath为例: ... -
GET请求的中文乱码问题及处理意义
2015-07-03 13:47 6588首先看一段乱码的程序 ... -
java.ByteArrayInputStream与ByteArrayOutputStream再次理解
2015-03-16 17:59 3188第一次看到ByteArrayOutputStream的时 ... -
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
2014-07-28 17:42 2207概述 继 Spring 2.0 对 Spring MVC ... -
java中序列化的serialVersionUID解释
2014-07-25 09:26 1836serialVersionUID: 字面意思上是序列化的版本号 ...
相关推荐
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。 代理模式是常用的java设计模式,他的特征是代理类与委托类有...
Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。
java 观察者模式 事件委托
代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...
对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...
设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造...代理模式34 1.3 行为型模式37 1.3.1 责任链模式37 1.3.2 命令模式40 1.3.3 解释器模式43 1.3.4 迭代器模式45 1.3.5 中介者模式49 1.3.6 备忘...
代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...
代理模式(Proxy Pattern) 定义:Provide a surrogate or placeholder for another object to control access to it. (为其他对象提供一种代理以控制对这个对象的访问。) ● Subject 抽象主题角色 抽象主题类可以是...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式...
Java软件体系结构设计模式之结构模式(11种) 结构模式主要用来: 1)处理把责任委托给... 1)装饰器模式用于动态地扩展一个对象的功能,而不需要改变原始的类代码或使用继承。这一点是通过在一个实际对象的外
所以,本人根据Java的监听器概念实现的观察者模式,重新用C#代码来描述了C#的难点技术--代理、事件、事件句柄--^_^...希望能够给C#的fan们带来帮助。 阅读条件:熟悉C#语言,会使用csc命令。 阅读人员:非常熟悉...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...
java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...