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
      • 酒吧
      • 巴兹
也就是说,我想实现
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。