sap-erp实施心得_实施动态代理-比较

sap-erp实施心得

有时需要拦截某些方法调用,以便每次调用被拦截方法时都执行自己的逻辑。 如果您不属于Java EE的CDI领域,并且不想使用诸如Aspectj之类的AOP框架,那么您将有一个简单而有效的替代方法。

从1.5版开始,JDK附带了类java.lang.reflect.Proxy,该类允许您为给定的接口创建动态代理。 每当应用程序调用代理上的方法时,都会调用位于动态创建的类后面的InvocationHandler。 因此,您可以在调用某个框架或库的代码之前动态控制执行什么代码。

在JDK的Proxy实现旁边,像javassist或cglib这样的字节码框架提供了类似的功能。 在这里,您甚至可以对现有的类进行子类化,并确定要转发给超类的实现的方法以及要拦截的方法。 当然,这会带来项目依赖的另一个库的负担,并且可能需要不时更新,而运行时环境中已经包含了JDK的Proxy实现。

因此,让我们仔细看看并尝试这三种选择。 为了将javassist和cglib的代理与JDK实现进行比较,我们需要一个由简单类实现的接口,因为JDK机制仅支持接口,而没有子类:

public interface IExample {void setName(String name);
}public class Example implements IExample {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}

为了将代理上的方法调用委托给某个实际对象,我们创建了上面的Example类的实例,并通过最终声明的变量在InvocationHandler中调用它:

final Example example = new Example();
InvocationHandler invocationHandler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return method.invoke(example, args);}
};
return (IExample) Proxy.newProxyInstance(JavaProxy.class.getClassLoader(), new Class[]{IExample.class}, invocationHandler);

从代码示例中可以看到,代理的创建非常简单:调用静态方法newProxyInstance()并提供ClassLoader,应由代理实现的接口数组以及InvocationHandler接口的实例。 为了演示起见,我们的实现仅转发我们之前创建的Example实例。 但是,在现实生活中,您当然可以执行更高级的操作,以评估例如方法名称或其参数。

现在我们来看一下使用javassist完成相同操作的方式:

ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Example.class);
Class aClass = factory.createClass();
final IExample newInstance = (IExample) aClass.newInstance();
MethodHandler methodHandler = new MethodHandler() {@Overridepublic Object invoke(Object self, Method overridden, Method proceed, Object[] args) throws Throwable {return proceed.invoke(newInstance, args);}
};
((ProxyObject)newInstance).setHandler(methodHandler);
return newInstance;

在这里,我们有一个ProxyFactory,它想知道应该为哪个类创建子类。 然后,我们让ProxyFactory创建一个整个类,该类可以根据需要多次重用。 这里的MethodHandler与InvocationHandler类似,后者是为实例的每次方法调用而调用的。 在这里,我们再次将调用转发到之前创建的Example实例。

最后但并非最不重要的一点,让我们看一下cglib的代理:

final Example example = new Example();
IExample exampleProxy = (IExample) Enhancer.create(IExample.class, new MethodInterceptor() {@Overridepublic Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {return method.invoke(example, args);}
});
return exampleProxy;

在cglib世界中,我们有一个Enhancer类,可用于通过MethodInterceptor实例实现给定的接口。 回调方法的实现看起来与javassist示例中的实现非常相似。 我们只是通过反射API将方法调用转发到Example的现有实例。

现在,我们已经看到了三种不同的实现,我们还希望评估它们的运行时行为。 因此,我们编写了一个简单的单元测试,它测量了每个实现的执行时间:

@Test
public void testPerformance() {final IExample example = JavaProxy.createExample();long measure = TimeMeasurement.measure(new TimeMeasurement.Execution() {@Overridepublic void execute() {for (long i = 0; i < JavassistProxyTest.NUMBER_OF_ITERATIONS; i++) {example.setName("name");}}});System.out.println("Proxy: "+measure+" ms");
}

我们选择大量的迭代,以强调JVM并让HotSpot编译器为经常执行的段落创建本机代码。 下表显示了三种实现的平均运行时间:

2014-01-14_proxies_chart

为了完全显示代理实现的影响,该图表还显示了对Example对象(“无代理”)进行标准方法调用的执行时间。 首先,我们可以记录到代理实现比方法本身的普通调用慢大约10倍。 但是我们也注意到三种代理解决方案之间的差异。 令人惊讶的是,JDK的Proxy类几乎与cglib实现一样快。 只有javassist的退出时间是cglib的两倍左右。

结论:运行时代理易于使用,您有不同的处理方式。 JDK的代理仅支持接口代理,而javassist和cglib允许您对现有类进行子类化。 代理的运行时行为比标准方法调用慢大约10倍。 三种解决方案在运行时间方面也有所不同。

参考: 实现动态代理–来自我们的JCG合作伙伴 Martin Mois在Martin's Developer World博客上的比较。

翻译自: https://www.javacodegeeks.com/2014/01/implementing-dynamic-proxies-a-comparison.html

sap-erp实施心得

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保存点云数据_PCL入门系列三——PCL进行数据读写

本节课我们将了解到以下内容&#xff1a;基本的PCL中的数据类型&#xff1b;使用PCL进行简单编程&#xff1a;写文件与读文件。一、PCL库基本数据类型上一节课&#xff0c;我们使用PCL库在本地写入了一个名为test_pcd.pcd的文件。我们划分一下程序的任务步骤&#xff1a;构造pc…

计算机辅助技术课设,《计算机辅助设计技术》课程标准-20210311103339.doc-原创力文档...

.《计算机辅助设计技术》课程标准教研室主任&#xff1a;专业带头人&#xff1a;(部 )主任&#xff1a;教务处处长&#xff1a;教学副院长&#xff1a;审核批准日期&#xff1a;二○一三年 十二月Word 资料.《计算机辅助设计》课程标准(基本信息)课程编码&#xff1a;课程类别&…

工业交换机技术优点

工业领域工作过的人都会知道&#xff0c;工业上的交换机称之为工业以太网交换机&#xff0c;工业以太网交换机就是我们常说的工业交换机&#xff0c;工业交换机是专门为了满足灵活多变的工业应用需求而设计的工业设备&#xff0c;它提供一种高性价比工业以太网通讯解决方案。所…

win8系统的计算机共享在哪里设置方法,win10系统设置与win8系统局域网文件共享的方案...

win10系统使用久了&#xff0c;好多网友反馈说关于对win10系统设置与win8.1系统局域网文件共享设置的方法&#xff0c;在使用win10系统的过程中经常不知道如何去对win10系统设置与win8.1系统局域网文件共享进行设置&#xff0c;有什么好的办法去设置win10系统设置与win8.1系统局…

python中输入字符串中只有字母_python中,只有一个字母的字符串属于类型

python中,只有一个字母的字符串属于类型 答:字符串 智慧职教: 静脉输液流程输液规划的哪一种形式? 答:程序 26. 患者,男性,38岁,体重80kg,从高空坠落后导致肝破裂,入院后须立即进行手术治疗。住院处护理人员首先应 答:护送患者入院 中国大学MOOC: 有人说:“流浪汉都是不想…

光端机的使用方法

光端机是一种不仅可以传输视频信号&#xff0c;还能传输音频、电话、网络、和很多种控制信号的以太网介质传输设备&#xff0c;目前主要使用安防监控行业。那么&#xff0c;光端机是怎么使用的&#xff0c;接下来就由飞畅科技的小编来为大家详细介绍下光端机的使用方法吧&#…

python脚本设置环境变量_详解如何设置Python环境变量?

家好&#xff0c;我是Yivies&#xff01;相信大家多多少少遇到过这样的情况吧&#xff1f;就是在安装了python之后想完整在命令提示符直接输入python就可以使用的操作&#xff0c;但是会出现输入了python之后找不到命令的情况&#xff01;例如这样↓↓↓但是&#xff01;这并不…

vmware服务器虚拟化实施文档,VMware服务器虚拟化

vmware服务器虚拟化技术,简介了服务器虚拟化解决的问题以及vmware服务器虚拟化技术Vm最新版的服务器虚拟化解决方案貌似叫做vSphere_4.1&#xff0c;其中也是包括了ESX和Vcenter来实现功能的&#xff0c;主要能够实现的功能有&#xff1a;1、 Vmotion&#xff0c;实现虚拟机的动…

使用Junit参数在更短的时间内编写更好的单元测试

大多数人都知道单元测试的重要性和好处&#xff0c;以及为什么要在进行的项目中使用它们。 而且&#xff0c;大多数人不喜欢在他们从事的项目中编写单元测试。 TDD的人当然处于另一面&#xff0c;但根据我的经验&#xff0c;他们在IT行业中是少数派。 说到我&#xff0c;我和大…

光端机常见五大故障问题及解决方法

光端机&#xff0c;就是光信号传输的终端设备。光端机在安防中的作用&#xff0c;主要还是起到光端机本身的传输作用。光端机的作用是把一些传输距离比较近的信号转换为传输距离相对较远的信号进行传输&#xff0c;主要的作用是增加传输距离和在监控中起到节约成本的作用。光端…

用香港服务器建收费网站,使用香港站群服务器搭建网站的好处有哪些?

香港站群服务器搭建网站的作用&#xff1a;1、香港站群服务器有利于提高网站被搜索引擎收录情况;2、搭建站群能够有效降低网站被封的风险;3、当网站遭受攻击时&#xff0c;可快速通过带有独立IP的网站来查出问题所在&#xff0c;从而有效提高服务器的维护。香港站群服务器搭建站…

分数化简_分数应用题七讲 (一) 图示法解分数应用题

一、今日一讲图示法就是用线段图(或其它图形)把题目中的已知条件和问题表示出来&#xff0c;这样可以把抽象的数量关系具体化&#xff0c;往往可以从图中找到解题的突破口。运用图示法教学应用题&#xff0c;是培养思维能力的有效方法之一。图示法不仅可以形象地、直观地反映分…

E1光端机和2M光端机有什么区别?

光端机&#xff0c;电信非压缩光端机&#xff0c;就是将多个E1&#xff08;一种中继线路的数据传输标准&#xff0c;通常速率为2.048Mbps&#xff0c;此标准为中国和欧洲采用&#xff09;信号变成光信号并传输的设备。E1的定义的就是2048K。 接下来我们就来为大家详细介绍下光端…

javadoc maven_创建Maven源代码和Javadoc工件

javadoc maven许多人都知道Maven源代码和Javadoc工件&#xff0c;但是不知道为什么要创建它们。 我绝对是在这个阵营中–我可以理解为什么人们想要此信息&#xff0c;但是由于需要手动导航Maven存储库&#xff0c;因此获取信息似乎相对效率较低。 然后我被线索棒击中。 这些工…

发送广播_DHCP服务器什么时候发送?为什么request要广播发送?那还不看?

动态主机配置协议&#xff1a;DHCP 用来集中管理、分配IP地址&#xff0c;使网络环境中的主机能够动态获取IP地址、网关地址、DNS服务器地址等信息&#xff1b;DHCP采用客户端服务器模式&#xff0c;端口号&#xff1a;客户端为68(中继模式下67)&#xff0c;服务器端为67版本一…

开关量光端机指示灯说明及常见故障问题处理方法

开关量光端机可以使开关量信号通过光缆在光纤上传输双向控制。全数字光传输通道&#xff0c;确保高质量的信号传输。面板上有电源指示灯、光信号指示灯数据信号指示灯&#xff0c;可以直观的检测电源、光信号、数据信号状态。单向系列开关量光端机是高性能&#xff0c;高可靠性…

为特使建立控制平面的指南-部署权衡

部署控制平面组件 构建并设计了控制平面后&#xff0c;您将需要确切确定如何部署其组件。 在这里&#xff0c;您可以选择将控制平面与数据平面共置一处以集中控制平面。 这里还有一个中间立场&#xff1a;部署与控制平面位于同一位置的某些组件&#xff0c;并使某些组件保持集中…

大牛服务器超时位置模拟失败,大牛模拟定位掉线怎么办 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-07-07在第四期"微分享"活动中,有许多游戏大牛向小智讲述了关于玩游戏的妙招.巧招和绝招,现小智将这些内容推送给大家! 1.如何在3v3中取得好名次?(由"天才的小白"玩家供稿) 打3v3 ...标签&#xff1a;游乐网 游戏攻略发布时间&am…

宋佳乐博客全站正版PHP源码下载丨自助建站源码丨音乐外链源码丨最新图床源码丨官方网站源码丨网页跳转源码丨云相册源码丨打包下载

本套源码共包含了六套网站系统&#xff0c;请在下方看演示站&#xff1a; 一&#xff1a;主页跳转演示地址&#xff1a;http://ssl.songjiale.com&#xff08;无演示图&#xff09; 二&#xff1a;官方网站演示地址&#xff1a;http://ssl.songjiale.com/upload &#xff08;…

丰田pcs可以关闭吗_别只知道开不坏,现在的丰田还有这些厉害绝招!

记得我刚毕业一年多的时候&#xff0c;有个同龄的同事——三金&#xff0c;买了一台丰田的卡罗拉。那是一台上一代的卡罗拉。三金之所以买卡罗拉&#xff0c;就是图它省心省油保养便宜。那一代卡罗拉采用了keen-look设计&#xff0c;算是在年轻化上迈出了半只脚后来大家调侃他“…