当前位置:  软件>java软件

不使用构造方法创建对象 Objenesis

    来源:    发布时间:2015-01-21

    本文导语:  如果一个类没有参数为空的构造方法时候,那么你直接调用newInstance方法试图得到一个实例对象的时候是会抛出异常的。能不能有 办法绕过构造方法来实例化一个对象呢?Objenesis 为其提供了在四个不同的jvm上的解决方案。 Sun ...

如果一个类没有参数为空的构造方法时候,那么你直接调用newInstance方法试图得到一个实例对象的时候是会抛出异常的。能不能有 办法绕过构造方法来实例化一个对象呢?

Objenesis 为其提供了在四个不同的jvm上的解决方案。

  •  Sun Hotspot VM, versions 1.3, 1.4, 1.5 and 1.6

  •  GCJ version 3.4.4 (tested on Windows/Cygwin)

  •  BEA JRockit versions 7.0 (1.3.1), 1.4.2 and 1.5

  •  Aonix PERC (no serialization support), tested on version  5.0.0667

从运行平台上得到几个关键的参数,如下:

  • /** JVM version */

  • protected static final String VM_VERSION = System.getProperty("java.runtime.version");   


  • /** JVM version */

  • protected static final String VM_INFO = System.getProperty("java.vm.info");   


  • /** Vendor version */

  • protected static final String VENDOR_VERSION = System.getProperty("java.vm.version");   


  • /** Vendor name */

  • protected static final String VENDOR = System.getProperty("java.vm.vendor");   


  • /** JVM name */

  • protected static final String JVM_NAME = System.getProperty("java.vm.name");  

  • 然后根据得到的参数进行判断:

    根据得到平台提供的jvm版本和供应商来选择不同的实例化策略。
    说实话,这几个平台里面我还 是对sun公司提供的相对熟悉一些,所以除了sun公司提供的jvm对于的实例策略我在这里就不介绍了,
    大家有兴趣的话可以去项目主页下载下来细 细研究。

    现在我们仅仅关注sun公司的,并且版本大于1.3的。
    版本为1.3的jvm具体实例化策略这里不做讨论了,有兴趣的可 以去看objenesis的实现。

    代码如下:

  • import sun.reflect.ReflectionFactory;    

  • public class SunReflectionFactoryInstantiator implements ObjectInstantiator {   


  • private final Constructor mungedConstructor;   


  • public SunReflectionFactoryInstantiator(Class type) {    


  • ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();    

  • Constructor javaLangObjectConstructor;   


  • try {    

  • javaLangObjectConstructor = Object.class.getConstructor((Class[]) null);   

  • }   

  • catch(NoSuchMethodException e) {    

  • throw new Error("Cannot find constructor for java.lang.Object!");    

  • }   

  • mungedConstructor = reflectionFactory.newConstructorForSerialization(type,    

  • javaLangObjectConstructor);   

  • mungedConstructor.setAccessible(true);   

  • }   


  • public Object newInstance() {    

  • try {    

  • return mungedConstructor.newInstance((Object[]) null);   

  • }   

  • catch(Exception e) {    

  • throw new ObjenesisException(e);   

  • }   

  • }   

  • }   


  • 通过sun.reflect.ReflectionFactory这 个类来实例化一个class那么就绕过了其类的构造方法,我们可以暂且称之为绕道方式实例一个对象。
    希望上面的代码能给大家起到一定的帮助,另外easymock的 最新版本已经使用了Objenesis来实例化一个Class获取对象。

    介绍来自 blogjava— @和风赛跑


        
     
     
     
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 1. 请问linux下可以使用“typedef list<对象*> 对象列表名 ”和iterator吗?
  • 使用XmlSerializer序列化List对象成XML格式(list对象序列化)
  • 请教一个java中有关对象使用的问题
  • 请问自己定义的对象如何使用Hashtable存取?
  • linux下动态库中如何导出对象进行使用
  • ASP.NET中application对象的使用介绍
  • 使用完ejb对象,快速释放出它占用的空间,而不删除数据库记录,是用的那条语句?
  • 两个简单问题:在javaBean中能用out.println()输出页面吗?javaBean中可以使用servlet建立的session对象变量值吗?
  • 请大家帮忙,怎样使用ResultSet对象的absolute()方法来提取指定行的数据?
  • linux下动态库中如何导出对象进行使用 iis7站长之家
  • Asp.ne response对象与request对象使用介绍
  • 在数据库中参数的输入 使用PreparedStatement对象出错
  • 对象序列化--存储数据库的方法 序列化后 不能使用
  • jquery使用jquery.zclip插件复制对象的实例教程
  • 请教使用相关值对象的理解和使用问题。(请大家帮忙)
  • Java对象初始化顺序的使用
  • 散点分,顺便问一下哪位有JavaScript的使用帮助资料<主要是里面的各种对象及方法属性的使用>
  • 在线等待:jsp内置对象的详细使用例子.要代码.如果给出详细资料也可考虑给分.100大洋伺候.
  • php使用反射插入对象示例分享
  • 简单小问题,指点迷津。不是一个包中类可以不引用随便调用么?我在jb使用中,用自己做的类生成对象,怎么说找不到?
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3