【发布时间】:2018-08-07 00:03:30
【问题描述】:
我的类层次结构如下:
- PersistedObject(不能修改
或扩展这个)- 富
- 酒吧
- 巴兹
其中Foo、Bar、Baz 是扩展 PersistedObject 的类。但是有代码味道,Foo、Bar 和 Baz 都有一个对象复制的实现,每个类中基本相同,没有类型文字:
protected PersistedObject copy() {
Foo copy = toBuilder().build();
copy.copyPersistedObject(this);
return copy;
}
我通过超类获得copyPersistedObject,它实现了与数据库持久性相关的逻辑。
所以我想从Foo、Bar 和Baz 中删除所有这些样板。理想情况下,我会做到这一点:
- PersistedObject(不能修改或扩展它)
- CustomPersistedObject
- 富
- 酒吧
- 巴兹
- CustomPersistedObject
也就是说,我想实现 copy() 的单个实现,并使其 Foo、Bar 和 Baz 都扩展自我的 CustomPersistedObject 类。
不过,copy() 方法的第一行要求我使用具体类型来缓存对象预复制的状态,因为 Foo、Bar 和 Baz 分别添加自己的不同字段到PersistedObject,然后执行copyPersistedObject()处理数据库的东西,最后返回我在copyPersistedObject调用后捕获的状态。
所以,我有点想用反射来完成这项工作,有什么方法可以在运行时获取 java 对象的.class,然后将其用作类型本身来实例化?
我想达到这样的目的:
protected PersistedObject copy() {
Class<?> clazz = this.getClass();
[clazz.asType] copy = toBuilder().build();
copy.copyPersistedObject(this);
return copy;
}
【问题讨论】:
-
你能让
PersistedObject通用吗?你能把Class传递给copy吗? -
如果
PersistedObject不能被修改或扩展,那它怎么能有CustomPersistedObject作为子类呢?您是否可能需要删除“或扩展”部分? -
我的措辞不好,我不能修改它,但我可以从它扩展到一个新的子类。
标签: java inheritance reflection