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编译器为经常执行的段落创建本机代码。 下表显示了三种实现的平均运行时间:

为了完全显示代理实现的影响,该图表还显示了对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实施心得

sap-erp实施心得_实施动态代理-比较相关推荐

  1. spring 动态代理_分析动态代理给 Spring 事务埋下的坑

    前言 Spring的声明式事务让我们不在编写获得连接.关闭连接.开启事务.提交事务.回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理.我们知道Spring事务基 ...

  2. 代理类 invoke方法没有返回值怎么办_何为动态代理?

    在程序运行期,创建目标对象的代理对象,对目标对象中的方法进行功能性增强的一种技术: 它就是JVM中,对象方法的拦截器 write less do more!! 回顾OOP(面向对象编程) 三大特征:封 ...

  3. 你是真正的SAP ERP咨询顾问吗?

    声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司.注:文中所示截图来源SAP软件,相应著作权归SAP所有. 一.什么是顾问? 东方:"顾问"一词最早出现在 ...

  4. SAP License:ERP对供应链管理和实施

    如果凭直觉来判断,对安全性.稳定性要求很高的能源与资源行业通常会倾向于采用成熟的软件产品.出人预料的是,今年年初才推出的SAPS/4HANA却备受能源与资源行业的青睐,能源与资源行业带来的S/4HAH ...

  5. SAP CS模块拓展项目实施建议书

    客户服务CS-Customer Service模块是SAP ERP系统的一个标准模块,主要用于企业在销售产品后对客户售后服务的管理. 随着企业行业/产品市场的成熟,对客户售后服务的要求应为逐渐提高:我 ...

  6. SAP、Oracle客户及实施商名单

    SAP.Oracle客户及实施商名单 OracleERP 客户名单 1 摩托罗拉 2 LG 电子 3 济南钢铁 4 长安福特 5 百度 6 伊利 7 亚信 8 佳通 9 移动 10 电信 11 湘钢 ...

  7. SAP S/4 HANA Cloud实施方法论

    更多内容请关注微信公众号:S4HC参与者俱乐部 大魔王文笔不好,所以就用大白话和大家分享一下自己学习理解的SAP S/4 HANA Cloud项目快速实施方法论,在此声明该文章仅代表大魔王对S4HC的 ...

  8. ERP项目6大实施风险及如何规避!

    随着企业竞争的日益加剧,一些企业纷纷投入巨资实施自己的ERP系统,以期通过系统的实施达到提高企业管理水平.提升企业经济效益和竞争力的目的.但ERP实施失败的声音不绝于耳,怎么办?怡海软件依据多年来从事 ...

  9. 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试

    文章目录 Java的静态代理 静态代理的优缺点 ABAP的静态代理 Spring AOP的动态代理 JDK动态代理的优缺点 CGLIB动态代理的优缺点 ABAP CGLIB的模拟实现 ABAP Pre ...

最新文章

  1. numpy 矩阵转置
  2. vue--axios请求头设置传输编码格式+
  3. android 编辑框带拖动,Android带输入框的对话框
  4. 基金指数温度怎么算_鱼缸加热棒必不可少的东西,我们怎么正确使用?
  5. transform你不知道的那些事
  6. c语言按shift用户随时退出,2014年云南省“三校生”高考计算机第三次模拟试卷...
  7. 报错, nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException
  8. ai模仿声音软件_你准备好跟AI机器成为同事了吗?
  9. 如何在Shell脚本中使用if-else?
  10. vue中组件间的传参
  11. 卸载自己编译的程序(ubuntu14.04)
  12. 使用Latex排版一篇IEEE Robotics and Automation Letters期刊文章
  13. tomcat配置manger账户和host-manager账户的方法详细图解
  14. Unity内置Shader解读3——Decal
  15. Ansible playbook
  16. Matlab帮助文档设置
  17. 西南科技大学计算机科学与技术学院官网,何刚(西南科技大学计算机科学与技术学院副教授)_百度百科...
  18. 物联网卡技术的8种通信协议
  19. python制作相册_《自拍教程73》Python 自动生成相册文件夹
  20. 饥荒联机版Mod开发——配置代码环境(二)

热门文章

  1. codeforces1485 F. Copy or Prefix Sum(dp)
  2. 【并查集】Supermarket(poj 1456/luogu-UVA1316)
  3. Hadoop入门(九)Mapreduce高级shuffle之Combiner
  4. 浅析神经网络为什么能够无限逼近任意连续函数
  5. 最值得程序员get的30本行业干货
  6. 互联网账户系统如何设计
  7. 顺时针打印3*3矩阵
  8. springboot+mybatis-plus实例demo
  9. 面向对象VS面向过程
  10. React生命周期(新)