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…

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

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

光端机的使用方法

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

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

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

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

一、今日一讲图示法就是用线段图(或其它图形)把题目中的已知条件和问题表示出来&#xff0c;这样可以把抽象的数量关系具体化&#xff0c;往往可以从图中找到解题的突破口。运用图示法教学应用题&#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;…

css3怎么排除第一个,css怎么排除第一个子元素

css排除第一个子元素的方法&#xff1a;1、通过使用伪类选择器“:not”实现排除&#xff1b;2、通过使用“nth-of-type”或者“nth-child”实现排除&#xff1b;3、通过使用“”或者“~”兄弟选择符实现获取排除第一个之外的子元素。本文操作环境&#xff1a;windows7系统、HTM…

如何解决光端机的开关量问题?

光端机开关量问题可以说是光端机的常见问题之一&#xff0c;对监控效果有比较大的影响&#xff0c;那么&#xff0c;我们应该如何解决光端机的开关量问题呢&#xff1f;接下来就由杭州飞畅科技的小编来为大家详细讲解下吧&#xff0c;感兴趣的朋友就一起来了解下&#xff01; …

什么是电视光端机?电视光端机是怎么分类的?

现如今&#xff0c;随着国内通信网络的发展&#xff0c;电视光端机应用的监控范围也越来越广。在高速公路、银行、电力、电信等的监控领域都要求对视频信号进行远程的传输&#xff0c;目前主要的解决方法是利用光端机将视频信号转化为数字信号通过光纤进行传输。那么&#xff0…

mysql存储过程语法 if_mysql存储过程语法 if

MySql存储过程MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能&#xff0c;如果没有存储过程&#xff0c;在外部程序访问数据库时(例如 PHP)&#xff0c;要组织很多 SQL 语句。特别…

什么是模拟量光端机?模拟光端机品牌有哪些?

模拟光端机采用了 PFM 调制技术实时传输图象信号。发射端将模拟视频信号先进行 PFM 调制后&#xff0c;再进行电-光转换&#xff0c;光信号传到接收端后&#xff0c;进行光电转换&#xff0c;然后进行 PFM 解调&#xff0c;恢复出视频信号。由于采用了PFM 调制技术&#xff0c;…

什么是物理隔离?物理隔离光端机是什么?

什么是物理隔离&#xff1f; 物理隔离&#xff0c;是指采用物理方法将内网与外网隔离从而避免入侵或信息泄露的风险的技术手段。物理隔离主要用来解决网络安全问题的&#xff0c;尤其是在那些需要绝对保证安全的保密网&#xff0c;专网和特种网络与互联网进行连接时&#xff0c…

太极虚拟服务器,太极 中标 云服务器

太极 中标 云服务器 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。云服务器组是对云服务器的一种逻辑划分&#xff0c;云服务器组…

什么是自愈环网光端机?

对于光端机这块&#xff0c;相信大家都有所了解。但是&#xff0c;什么是自愈环网光端机呢&#xff1f;想必很多朋友对此不是很了解&#xff0c;相信大家可能会很感兴趣了解下自愈环网光端机吧。接下来就由飞畅科技的小编来为大家详细介绍下什么是自愈环网光端机吧&#xff0c;…

gui界面怎么分页_什么是用户界面和体验设计

本文译自 Mikos Philips 的 UI vs UX  —  A Guide to UI Design因为发现仍然有小伙伴跑来问我比较基础的专业划分问题&#xff0c;所以翻译了这篇科普文。——用户界面&#xff08;UI, User Interface&#xff09;设计是设计软件产品所涉及到的几个交叉学科之一。不论是用户…

詹金斯搭建_与詹金斯一起连续交付Heroku

詹金斯搭建如果您安装了Jenkins Git插件&#xff0c;那么利用Jenkins并针对Heroku的连续交付管道的设置就非常简单。 通过此管道&#xff0c;对特定Git分支的更改将导致Heroku部署。 为了使此部署过程正常运行&#xff0c;您应该至少使用两个Git分支&#xff0c;因为您希望有一…