不通过new创建类的实例

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不会。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 10,908评论 0 24
  • 总体而言,成功者和挣扎者之间的区别在于他们相反的工作方法:从里到外对从外到里。 从外到里的写作# 挣扎型作家倾向于...
    雪波阅读 659评论 0 1
  • 对话框:http://blog.csdn.net/zjq2010014137/article/details/85...
    大海一滴写字的地方阅读 495评论 0 0
  • 做人要勤奋,做人要执着,但做事不一定要图快。马跑起来比骆驼快,但骆驼一生走过的路却是马的两倍。没有人见到过在沙漠里...
    左拐再左拐阅读 192评论 0 0