不使用构造方法创建Java对象 Objenesis
来源:互联网 发布:python开发环境配置 编辑:程序博客网 时间:2024/06/04 00:47
如果一个类没有参数为空的构造方法时候,那么你直接调用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获取对象。
0 0
- 不使用构造方法创建Java对象 Objenesis
- objenesis——不使用构造方法创建Java对象
- 不使用构造方法创建Java对象: objenesis的基本使用方法
- 不使用构造方法创建Java对象: objenesis的基本使用方法
- javaScript系列之使用构造方法创建js对象(八)
- Java类对象的创建以及构造方法总结
- java反射调用配置文件构造类对象,使用其方法
- java反射调用配置文件构造类对象,使用其方法
- [java]反射机制给属性使用set方法构造对象
- Java常用对象构造方法
- JAVA面向对象-----构造方法
- 1105 Java中String字面值对象和构造方法创建对象的区别
- java面试题:String字面值对象和构造方法创建对象的区别
- 用构造方法构建对象时使用new关键字和不使用new关键字的差别
- 通过私有构造方法创建对象
- 通过私有构造方法创建对象(转)
- 关于构造方法与对象的创建
- 构造函数方法创建Mat对象
- 序列化和反序列 properties
- OpenWrt获取网关IP
- python性能测试脚本
- 16. 3Sum Closest
- Android Studio出现UnsupportedClassVersionError Unsupported major.minor version 52.0
- 不使用构造方法创建Java对象 Objenesis
- 事务隔离性和锁的区别和联系
- 易流专线货运物流软件 V14.02 网络版
- OC中nil、Nil、NULL、NSNULL的一些区别
- webservice接口实现数据共享的实现的初步解决方案(更新、删除)
- iOS学习之iOS沙盒(sandbox)机制和文件操作
- 《Java源码分析》:HashSet
- hdu 5734 Acperience(2016 Multi-University Training Contest 2——化简公式,数学推导)
- POJ3641-Pseudoprime numbers