实际测试中,JDK的动态类创建过程很快,这是因为在这个内置实现中defineClass()方法被定义为native实现,故性能高于其它几种实现。但在代理类的函数调用性能上,JDK的动态代理就不如CGLIB和Javassist的基于动态代理的代理。
https://segmentfault.com/a/1190000004360241
静态代理不使用反射
jdk动态代理生成的字节码也是使用反射调用被代理的方法
javaassist?
cglib?
asm?
不得不说的AOP——基于Javassist的动态代理实现http://exolution.iteye.com/blog/1460833
javaasist动态代理实现原理??
深入剖析动态代理–性能比较:http://blog.csdn.net/liutengteng130/article/details/46565309
Java查看动态代理生成的代码:http://www.cnblogs.com/ctgulong/p/5011614.html
JDK 动态代理
Cglib
Spring AOP
动态代理方案性能对比:
-
测试结论:
- ASM和JAVAASSIST字节码生成方式不相上下,都很快,是CGLIB的5倍。
- CGLIB次之,是JDK自带的两倍。
- JDK自带的再次之,因JDK1.6对动态代理做了优化,如果用低版本JDK更慢,要注意的是JDK也是通过字节码生成来实现动态代理的,而不是反射。 (个人理解应该说不是简单的使用反射,而是使用字节码生成类,这类会使用反射调用)
- JAVAASSIST提供者动态代理接口最慢,比JDK自带的还慢。
(这也是为什么网上有人说JAVAASSIST比JDK还慢的原因,用JAVAASSIST最好别用它提供的动态代理接口,而可以考虑用它的字节码生成方式)
差异原因:
各方案生成的字节码不一样,
像JDK和CGLIB都考虑了很多因素,以及继承或包装了自己的一些类,
所以生成的字节码非常大,而我们很多时候用不上这些,
而手工生成的字节码非常小,所以速度快
最终选型:
最终决定使用JAVAASSIST的字节码生成代理方式,
虽然ASM稍快,但并没有快一个数量级,
而JAVAASSIST的字节码生成方式比ASM方便,
JAVAASSIST只需用字符串拼接出Java源码,便可生成相应字节码,
而ASM需要手工写字节码。
-
评论
- 请问 用动态代理生成的bytecode是如何从jvm里导出来的?谢谢
可以用:
javap -c 类名
- 这样的测试对cglib不公平,因为javassit采用的是直接调用,而cglib走了methodProxy.invoke(),说白了还是反射调用。
可以实施cglib的直接调用,比如使用的Dispatcher或则LazyLoader。最后的生成的字节就是一个直接调用,性能上就可以和javassist持平。
class DirectService implements Dispatcher {
public Object loadObject() throws Exception {
return service;
}
}
来自:<http://javatar.iteye.com/blog/814426/>
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
Lotus Domino 是一种基于Notes技术的服务器端应用程序, Lotus Domino Java 代理是指在 Domino 服务器上运行的 Java 代理程序,可以用来处理用户请求、提供数据服务等。今天,我们将讨论如何在 Lotus Domino Java ...
在Lotus Domino开发环境中,Java代理是用于执行服务器端任务的重要工具,它们可以自动化许多功能,如处理数据、发送邮件等。"lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理...
在Lotus Domino中,你需要在Java代理的`NotesThread.sinitThread()`和`NotesThread.stermThread()`方法中初始化和终止Notes环境,确保与Domino服务器的交互正确进行。 一旦Excel文件生成并写入OutputStream,你可以...
这里提到的"IBM LotusNotes JAVA库 NCSO.jar Notes.jar"是用于Java开发的库文件,主要服务于与LotusNotes系统的交互。 NCSO.jar和Notes.jar是LotusNotes Java API的核心组成部分,它们提供了与LotusNotes服务器通信...
在 Lotus Domino 中,Java 代理是可以运行在 Domino 服务器上的小程序,它可以执行特定的任务,如获取当前用户名。 在 Java 代理中,获取当前用户名是一个常见的需求。 Lotus Domino 提供了多种方式来获取当前...
【标题】"Louts Notes集锦"所涵盖的知识点主要集中在Lotus Notes这一企业级协作软件上,特别是关于Java操作Domino API的实践与理论。Lotus Notes是IBM推出的一款强大的协同办公系统,它提供了电子邮件、日历、任务...
3. **Java API**:允许与Java平台集成,扩展Notes的功能,并利用Java的广泛库资源。 4. **Web集成**:Notes 4.6.3版本已经具备一定的Web支持,可以通过HTTP发布Notes应用,实现与Web浏览器的兼容。 5. **安全性与...
5. **Java Integration**: R5版本开始,Notes加强了对Java的支持,开发者可以通过Java来扩展Notes应用,利用Java的强大功能。 6. **UI设计**: Notes提供了丰富的UI组件,如按钮、文本框、列表等,使得开发者能够...
3. **Agentes**: 在Notes/Domino环境中,代理是自动化任务的脚本,可以定时运行或基于特定事件触发。它们可以用于数据同步、邮件发送等。 4. **Database Design**: 数据库设计包括表单(Forms)、视图(Views)、...
- **NotesSession:** 提供了与Notes会话相关的功能,例如登录和管理Notes会话。 - **NotesUIWorkspace:** 用于处理用户界面操作,如打开窗口和对话框。 - **NotesDatabase:** 代表一个Notes数据库,提供对...
2. **设计模式**:Java架构师需要熟悉并能灵活运用各种设计模式,如单例、工厂、观察者、装饰器、代理、适配器、建造者、策略、模板方法等。设计模式是解决常见软件设计问题的通用解决方案,它们是良好软件设计的...
10. **XPages**:XPages是Notes/Domino的一个现代开发技术,它基于Java和OpenAjax技术栈,允许开发者创建响应式、富互联网应用程序。XPages可以轻松地集成Web 2.0元素,如AJAX和社交功能。 11. **安全性**:Lotus ...
八、Java反射与动态代理 了解反射机制,它是Java运行时检查和修改对象行为的能力,用于实现元编程。动态代理则允许在运行时创建代理类,用于AOP(面向切面编程)或事件监听等功能。 九、JDBC与数据库编程 学习Java...
你可能需要了解如何使用Java API与Lotus Notes数据库交互,创建自定义的Lotus Script代理,或者编写独立的Java应用程序来与Notes服务器通信。 总的来说,这个测试程序涵盖了广泛的Java编程知识,并可能触及到企业级...
8. **XPages**:XPages是Lotus Notes的一种现代Web开发框架,它基于Java和OpenAjax技术,提供了更丰富的UI组件和MVC架构,可以更便捷地构建Web应用。 综上所述,"Lotus Notes HTML Edit"涉及的技术栈包括HTML编辑、...
总结,Lotus Notes邮件开发涉及到使用Java API创建邮件代理,通过搜索、创建文档,构建邮件内容,设置安全选项,以及最终发送邮件等多个步骤。开发者需要熟悉Lotus Notes的DOMINO API和Java编程语言,才能有效实现...
这个压缩包文件 "0809MyBatisHomework" 可能包含了与 Mybatis 相关的一系列实践案例,用于配合作者的"Mybatis notes"系列博客,帮助读者深入理解和应用 Mybatis 技术。 1. **Mybatis 简介**:Mybatis 是一款轻量级...
5. **数据库脚本**:Lotus Notes使用LotusScript或Java进行编程,这些脚本可以嵌入到表单、视图或代理中,实现更复杂的工作流逻辑。在模板中,开发者可能需要了解如何编写和调用这些脚本来控制工作流的运行。 6. **...
这份"java-senior-development-engineer-interview-notes-master.zip"压缩包显然是为了帮助准备这类面试而精心整理的资源。以下是基于这个主题可能涉及的一些核心知识点的详细解释: 1. **Java基础知识**:理解Java...
loveincode's notes 学习工作中的一些记录,收藏。 操作系统 , 编译原理 , 计算机网络 , 互联网协议... 常用数据结构与算法 Java 实现 数据结构 与 排序算法 常用设计模式 单例模式 , 工厂模式 , 装饰者模式 , 代理...