我相信这可以使用反射来完成,但在一个简单的示例中,这就是我想要完成的任务。
我有一个名为“Session”的类,它是一个基类(注意:不是抽象类,因为它可以在没有扩展的情况下构造)。我还有一个像这样存储的变量:
Class sessionObject = Session.class;
现在,Session 有一个带有单个参数的构造函数,即 AsynchronousSocketChannel
。但是,用户可以更改 session 对象,例如,假设他们有这样的:
public class NewSession extends Session {
....
}
然后他们设置sessionObject = NewSession.class
假设“Session”和“NewSession”具有相同的构造函数,我如何区分两者并根据其类
创建一个新实例。
请注意,我已经尝试过:
sessionObject.getClass().getDeclaredConstructors(AsynchronousSocketChannel.class).newInstance(result);
但是:
错误:(109, 49) java: 类 java.lang.Class 中的方法 getDeclaredConstructors 无法应用于给定类型; 必需:无参数 发现:java.lang.Class 原因:实际参数列表和形式参数列表的长度不同
最佳答案
Assuming that "Session" and "NewSession" have the same constructors, how would I differentiate between the two and create a new instance based on it's class.
Object.getClass()
返回 Class
对应于最派生(特定)类型的对象。
所以,如果您调用getClass()
在 NewSession
的实例上,您将得到Class
对应于 NewSession
的对象.
您无法创建 Session
来自 NewSession
的对象构造函数,反之亦然。因此,拥有 getDeclaredConstructors
是没有歧义的。在Class
.
Error:(109, 49) java: method getDeclaredConstructors in class java.lang.Class cannot be applied to given types; required: no arguments found: java.lang.Class reason: actual and formal argument lists differ in length
问题是 getDeclaredConstructors
(注意复数)不带任何参数,而 getDeclaredConstructor
接受Class<?>...
。您可能想使用后者。
此外,正如 Thomas Shields 指出的那样,您的 sessionObject
已经是 Class
。因此getClass()
其上将产生 Class
对于 Class
,而不是 Class
对于 NewSession
.
关于java - 根据 "Class"创建一个类的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30542088/