`
Kingson_Wu
  • 浏览: 120570 次
文章分类
社区版块
存档分类
最新评论

Java代理 Notes

 
阅读更多
  • 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
  • 动态代理:在程序运行时,运用反射机制动态创建而成。
    java静态代理和动态代理:http://layznet.iteye.com/blog/1182924

实际测试中,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 动态代理

  • JDK动态代理实现原理http://rejoy.iteye.com/blog/1627405
    JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
  • Java的动态代理

    1. JAVA自带的动态代理是基于java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler两个类来完成的,使用JAVA反射机制。
      通常使用下面方法创建代理对象:
    2. Object proxy = Proxy.newProxyInstance(定义代理对象的类加载器,要代理的目标对象的归属接口数组,回调接口InvocationHandler);
    3. JDK的动态代理会动态的创建一个$Proxy0的类,这个类继承了Proxy并且实现了要代理的目标对象的接口,但是在JDK中是找不到这个类的,因为它是动态生成的。
    4. 目标对象的方法调用被Proxy拦截,在InvocationHandler中的回调方法中通过反射调用。这种动态代理的方法实现了对类的方法的运行时修改。
      来自:http://blog.sina.com.cn/s/blog_548c8a8301013j6u.html
  • JDK也是通过字节码生成来实现动态代理的,但生成的字节码也是用反射的方式调用被代理对象的方法。


Cglib

  • JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

  • CGLib所创建的动态代理对象的性能比JDK的高大概10倍,但CGLib在创建代理对象的时间比JDK大概多8倍,所以对于singleton的代理对象或者具有实例池的代理,因为无需重复的创建代理对象,所以比较适合CGLib动态代理技术,反之选择JDK代理。值得一提的是由于CGLib采用动态创建子类的方式生成代理对象,所以不能对目标类中final的方法进行代理。
    来自http://www.xuebuyuan.com/324257.html

  • CGLib动态代理原理及实现:http://blog.csdn.net/yakoo5/article/details/9099133/
    CGLIB 和 JDK生成动态代理类的区别:http://luyuanliang.iteye.com/blog/1137292

  • cglib封装了asm,可以在运行期动态生成新的class。

  • CGLIB原理
    1. CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。
    2. CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
    3. CGLIB缺点:对于final方法,无法进行代理。
      来自http://shensy.iteye.com/blog/1867588

Spring AOP

    1. 基于JDK动态代理 ,可以将@Transactional放置在接口和具体类上。
    2. 基于CGLIB类代理,只能将@Transactional放置在具体类上。
      因此 在实际开发时全部将@Transactional放到具体类上,而不是接口上。
      建议大家使用基于Schema风格的事务(不用考虑这么多问题,也不用考虑是类还是方法)。而@Transactional建议放置到具体类上,不要放置到接口。
      来自http://jinnianshilongnian.iteye.com/blog/1508018
  • <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
    该配置方式是基于CGLIB类代理

    1. Spring使用JdkDynamicAopProxy实现代理
    2. Spring将使用CGLIB动态代理,而内部通过Cglib2AopProxy实现代理,而内部通过DynamicAdvisedInterceptor进行拦截
  • Spring中JDK动态代理和CGLIB动态代理的性能比较:
    http://www.thinksaas.cn/group/topic/130731/


动态代理方案性能对比:

  • 测试结论:

    1. ASM和JAVAASSIST字节码生成方式不相上下,都很快,是CGLIB的5倍。
    2. CGLIB次之,是JDK自带的两倍。
    3. JDK自带的再次之,因JDK1.6对动态代理做了优化,如果用低版本JDK更慢,要注意的是JDK也是通过字节码生成来实现动态代理的,而不是反射。 (个人理解应该说不是简单的使用反射,而是使用字节码生成类,这类会使用反射调用)
    4. JAVAASSIST提供者动态代理接口最慢,比JDK自带的还慢。
      (这也是为什么网上有人说JAVAASSIST比JDK还慢的原因,用JAVAASSIST最好别用它提供的动态代理接口,而可以考虑用它的字节码生成方式)
  • 差异原因:
    各方案生成的字节码不一样,
    像JDK和CGLIB都考虑了很多因素,以及继承或包装了自己的一些类,
    所以生成的字节码非常大,而我们很多时候用不上这些,
    而手工生成的字节码非常小,所以速度快

  • 最终选型:
    最终决定使用JAVAASSIST的字节码生成代理方式,
    虽然ASM稍快,但并没有快一个数量级,
    而JAVAASSIST的字节码生成方式比ASM方便,
    JAVAASSIST只需用字符串拼接出Java源码,便可生成相应字节码,
    而ASM需要手工写字节码。

  • 评论

    1. 请问 用动态代理生成的bytecode是如何从jvm里导出来的?谢谢
      可以用:
      javap -c 类名
    2. 这样的测试对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 java代理_获取传递值json

    Lotus Domino 是一种基于Notes技术的服务器端应用程序, Lotus Domino Java 代理是指在 Domino 服务器上运行的 Java 代理程序,可以用来处理用户请求、提供数据服务等。今天,我们将讨论如何在 Lotus Domino Java ...

    lotus domnio java代理传值

    在Lotus Domino开发环境中,Java代理是用于执行服务器端任务的重要工具,它们可以自动化许多功能,如处理数据、发送邮件等。"lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理...

    lotus Domino BS开发 通过java 代理导出excel.doc

    在Lotus Domino中,你需要在Java代理的`NotesThread.sinitThread()`和`NotesThread.stermThread()`方法中初始化和终止Notes环境,确保与Domino服务器的交互正确进行。 一旦Excel文件生成并写入OutputStream,你可以...

    IBM LotusNotes JAVA库 NCSO.jar Notes.jar

    这里提到的"IBM LotusNotes JAVA库 NCSO.jar Notes.jar"是用于Java开发的库文件,主要服务于与LotusNotes系统的交互。 NCSO.jar和Notes.jar是LotusNotes Java API的核心组成部分,它们提供了与LotusNotes服务器通信...

    lotus domnio java代理获取当前用户名

    在 Lotus Domino 中,Java 代理是可以运行在 Domino 服务器上的小程序,它可以执行特定的任务,如获取当前用户名。 在 Java 代理中,获取当前用户名是一个常见的需求。 Lotus Domino 提供了多种方式来获取当前...

    Louts Notes集锦

    【标题】"Louts Notes集锦"所涵盖的知识点主要集中在Lotus Notes这一企业级协作软件上,特别是关于Java操作Domino API的实践与理论。Lotus Notes是IBM推出的一款强大的协同办公系统,它提供了电子邮件、日历、任务...

    Notes4.6.3中文帮助文档

    3. **Java API**:允许与Java平台集成,扩展Notes的功能,并利用Java的广泛库资源。 4. **Web集成**:Notes 4.6.3版本已经具备一定的Web支持,可以通过HTTP发布Notes应用,实现与Web浏览器的兼容。 5. **安全性与...

    notes编程环境祥解和管理

    5. **Java Integration**: R5版本开始,Notes加强了对Java的支持,开发者可以通过Java来扩展Notes应用,利用Java的强大功能。 6. **UI设计**: Notes提供了丰富的UI组件,如按钮、文本框、列表等,使得开发者能够...

    louts notes编程学习笔记

    3. **Agentes**: 在Notes/Domino环境中,代理是自动化任务的脚本,可以定时运行或基于特定事件触发。它们可以用于数据同步、邮件发送等。 4. **Database Design**: 数据库设计包括表单(Forms)、视图(Views)、...

    Notes-JAVA面试题

    - **NotesSession:** 提供了与Notes会话相关的功能,例如登录和管理Notes会话。 - **NotesUIWorkspace:** 用于处理用户界面操作,如打开窗口和对话框。 - **NotesDatabase:** 代表一个Notes数据库,提供对...

    Java_Architect_Notes-Balaji.rar_java architect

    2. **设计模式**:Java架构师需要熟悉并能灵活运用各种设计模式,如单例、工厂、观察者、装饰器、代理、适配器、建造者、策略、模板方法等。设计模式是解决常见软件设计问题的通用解决方案,它们是良好软件设计的...

    Lotus Notes开发教程

    10. **XPages**:XPages是Notes/Domino的一个现代开发技术,它基于Java和OpenAjax技术栈,允许开发者创建响应式、富互联网应用程序。XPages可以轻松地集成Web 2.0元素,如AJAX和社交功能。 11. **安全性**:Lotus ...

    Java+JDK+7 Learning notes.zip_java_jdk

    八、Java反射与动态代理 了解反射机制,它是Java运行时检查和修改对象行为的能力,用于实现元编程。动态代理则允许在运行时创建代理类,用于AOP(面向切面编程)或事件监听等功能。 九、JDBC与数据库编程 学习Java...

    java语言实用教程测试程序

    你可能需要了解如何使用Java API与Lotus Notes数据库交互,创建自定义的Lotus Script代理,或者编写独立的Java应用程序来与Notes服务器通信。 总的来说,这个测试程序涵盖了广泛的Java编程知识,并可能触及到企业级...

    Lotus notes html edit

    8. **XPages**:XPages是Lotus Notes的一种现代Web开发框架,它基于Java和OpenAjax技术,提供了更丰富的UI组件和MVC架构,可以更便捷地构建Web应用。 综上所述,"Lotus Notes HTML Edit"涉及的技术栈包括HTML编辑、...

    Lotus Notes邮件开发

    总结,Lotus Notes邮件开发涉及到使用Java API创建邮件代理,通过搜索、创建文档,构建邮件内容,设置安全选项,以及最终发送邮件等多个步骤。开发者需要熟悉Lotus Notes的DOMINO API和Java编程语言,才能有效实现...

    Mybatis notes系列博客配套资源

    这个压缩包文件 "0809MyBatisHomework" 可能包含了与 Mybatis 相关的一系列实践案例,用于配合作者的"Mybatis notes"系列博客,帮助读者深入理解和应用 Mybatis 技术。 1. **Mybatis 简介**:Mybatis 是一款轻量级...

    Lotus Notes的C/S结构的工作流模板

    5. **数据库脚本**:Lotus Notes使用LotusScript或Java进行编程,这些脚本可以嵌入到表单、视图或代理中,实现更复杂的工作流逻辑。在模板中,开发者可能需要了解如何编写和调用这些脚本来控制工作流的运行。 6. **...

    java-senior-development-engineer-interview-notes-master.zip

    这份"java-senior-development-engineer-interview-notes-master.zip"压缩包显然是为了帮助准备这类面试而精心整理的资源。以下是基于这个主题可能涉及的一些核心知识点的详细解释: 1. **Java基础知识**:理解Java...

    notes:JavaJava后端工程师的学习笔记https

    loveincode's notes 学习工作中的一些记录,收藏。 操作系统 , 编译原理 , 计算机网络 , 互联网协议... 常用数据结构与算法 Java 实现 数据结构 与 排序算法 常用设计模式 单例模式 , 工厂模式 , 装饰者模式 , 代理...

Global site tag (gtag.js) - Google Analytics