美文网首页程序员
不通过new创建类的实例

不通过new创建类的实例

作者: oraoto | 来源:发表于2017-03-01 02:10 被阅读87次

instantiator是Doctrine的一个子项目,功能是不通过构造函数来创建一个类的实例。

先不看代码,我要怎样实现这个功能呢?我只有一个类名,还不给我用new,类也不一定有静态方法拿到实例,怎么办呢?

instantiator的答案是反序列化和反射。

反射是比较简单的,用ReflectionClass::newInstanceWithoutConstructor,但是有一点限制:内部类且为final的情况下,不能实例化。

newInstanceWithoutConstructor的限制

这种情况就要通过反序列化来实例化。

例如这个类A:

class A {
    public $a = 3;
}

它的一个实例序列化之后是这样的:

O:1:"A":1:{s:1:"a";i:3;}

O是序列化格式,第一个1是类名的长度,A是类名,第二个1是属性的个数,在后面是各项属性。

反序列化的时没对象属性,属性会初始化成默认值,例如O:1:"A":0:{} 也能反序列化。

那有多少种序列化格式呢?两种,O和C,C会调用Serializable接口的unserialize,O不会。

所有,我知道类名,只要构造一个字符串,然后反序列化就能得到一个实例。

相关文章

  • 不通过new创建类的实例

    instantiator是Doctrine的一个子项目,功能是不通过构造函数来创建一个类的实例。 先不看代码,我要...

  • Python中的__init__/__new__/__call_

    __new__创建类的实例,用于控制新实例的创建 __init__ 用于new创建实例后,初始化实例变量 __ca...

  • 整体架构

    常见构造函数创建实例和无new创建实例。原文地址 jquery代码 return new 类是为了无new和隔离各...

  • SpringBean 的实例化过程

    一个Bean 的实例化过程 不通过new 对象 Spring 是如何实例化对象的? 创建一个javaBean , ...

  • DAY1

    创建类class name{//class body}创建实例var xx=new name();类constru...

  • python中元类的__call__方法的作用

    元类是类的类,元类之于类就相当于类之于实例。元类的new方法会创建一个类并返回,就像类的new方法会创建一个实例并...

  • 8-6 myorm以及metaclass和class

    init 是用来完善实例的属性的 问题:new 到底是实例 还是 类? A: new 是用来创建实例的 ; 但...

  • C#——类的定义与使用

    类的实例 (1)对象的定义与创建对象名 = new 类名();例如:Student a = new Studen...

  • JavaScript new 关键字

    new 关键字 在JavaScript中, new 关键字用来创建一个类(模拟类)的实例对象。 实例化对象之后, ...

  • Java Reflection

    类 类的实例对象 如何创建类的实例对象? 直接new通过class实例化(需要有无参数的构造方法) CLass类的...

网友评论

    本文标题:不通过new创建类的实例

    本文链接:https://www.haomeiwen.com/subject/mjafgttx.html