Java 使用类对象作为类型
我的类层次结构如下所示:Java 使用类对象作为类型,java,inheritance,reflection,Java,Inheritance,Reflection,我的类层次结构如下所示: PersistedObject(无法修改或扩展此对象) 福 酒吧 巴兹 其中,Foo,Bar,Baz是扩展PersistedObject的类。但是有一种代码味道,Foo、Bar和Baz都有一个对象复制的实现,在每个类中基本相同,没有类型文字: protected PersistedObject copy() { Foo copy = toBuilder().build(); copy.copyPersistedObject(this);
- 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
添加了各自不同的字段,然后执行copyepersistedObject()
处理数据库内容,最后返回调用copyPersistedObject
后捕获的状态
所以,我试图用反射来完成这项工作,有没有办法在运行时获得java对象的.class
,然后将其作为类型本身来实例化
我想讲到这样一个问题:
protected PersistedObject copy() {
Class<?> clazz = this.getClass();
[clazz.asType] copy = toBuilder().build();
copy.copyPersistedObject(this);
return copy;
}
受保护的持久对象副本(){
Class clazz=this.getClass();
[clazz.asType]copy=toBuilder().build();
copy.copyPersistedObject(此);
返回副本;
}
一旦获得类
对象,就可以反射式地找到构造函数,选择合适的构造函数,并调用构造函数#newInstance(…)
方法
这些都清楚地记录在Javadoc中
不过,问题是copy()
方法的第一行
要求我使用具体类型来缓存对象的状态
预复制自Foo
、Bar
和Baz
以来,每一个都将各自不同的字段添加到
持久化对象
等一下。你似乎有个误解。您之前说过,通过超类获得copyPersistedObject
,因此它要么是超类的实例方法,要么是超类的静态方法。在这种情况下,变量copy
的声明类型与copyPersistedObject()
的行为无关。在每种情况下都将选择相同的实现,并且该实现显然对任何类型的Foo
、Bar
和Baz
的参数都是正确的。该实现没有看到调用方如何声明其参数
由于您将这个传递给该方法,因此我假定它是静态的。您似乎希望您的copy()
方法是一个实例方法,但从您介绍的情况来看,如果在CustomPersistedObject
上实现一次,您已经使用的几乎相同的模式将适用于所有Foo
、Bar
和Baz
,如下所示:
class CustomPersistedObject extends PersistedObject {
// ...
protected PersistedObject copy() {
CustomPersistedObject copy = toBuilder().build();
copy.copyPersistedObject(this);
return copy;
}
// ...
}
一个方法的工作方式与现有的三个方法不同的唯一方式是,如果copyPersistedObject()
实际上是每个子类上的不同静态方法,这与您描述的相反
所以,我试着把我的头绕在反射上,来得到这个
完成后,是否有任何方法可以在中获取java对象的.class
运行时,然后将其作为类型本身进行实例化
您可以使用类
对象来实例化相应类型的实例。对于类类或构造函数的newInstance()
方法,您可以从Javadocs中了解更多信息,但这似乎真的是找错了方向。您能将PersistedObject
设置为泛型吗?能否将类
传递给复制
?如果持久化对象
无法修改或扩展,那么它如何将自定义持久化对象
作为子类?您可能需要删除“或扩展”部分吗?我的措辞很糟糕,我无法修改它,但我可以从它扩展到一个新的子类。有趣的是,copyPersistedObject()
确实来自超类,因此,它不是在每个DTO上实现不同的方法。但是copyPersistedObject不是静态的。另外,如果我在CustomPersistedObject
类型的对象上调用构造函数.build()
,我想这可能会使我从对象中删除信息,因为我想保留从DTO类型、Foo
、Bar
和Baz
中获得的所有新信息。然而,这有助于我从另一个角度看待问题。我想我现在需要研究一下javadoc。