我相信这可以通过反射来完成,但在一个简单的例子中,这就是我想要完成的事情。
我有一个名为“Session”的类,它是一个基类(注意:不是抽象类,因为它可以在没有扩展的情况下构建)。我也有一个像这样存储的变量:
Class sessionObject = Session.class;
现在,Session有一个构造函数,它接受一个参数,即AsynchronousSocketChannel
。但是,用户可以更改会话对象,例如,假设他们有这个:
public class NewSession extends Session {
....
}
然后他们设置sessionObject = NewSession.class
假设“Session”和“NewSession”具有相同的构造函数,我将如何区分这两者并根据它class
创建一个新实例。
请注意,我试过了:
sessionObject.getClass().getDeclaredConstructors(AsynchronousSocketChannel.class).newInstance(result);
然而:
错误:(109,49)java:方法类java.lang.Class中的getDeclaredConstructors不能应用于给定的类型; 必需:没有参数 发现:java.lang.Class 原因:实际和正式的参数列表长度不同
答案 0 :(得分:1)
假设"会话"和#34; NewSession"具有相同的构造函数,我将如何区分这两个构造函数并基于它的类创建一个新实例。
Object.getClass()
返回与派生(特定)类型最相应的Class
对象。
因此,如果您在getClass()
的实例上致电NewSession
,您将获得与Class
对应的NewSession
对象。
您无法从Session
构造函数创建NewSession
对象,反之亦然。因此,getDeclaredConstructors
中Class
没有歧义。
错误:(109,49)java:方法类java.lang.Class中的getDeclaredConstructors不能应用于给定的类型; required:找不到参数:java.lang.Class reason:实际和形式参数列表的长度不同
问题在于getDeclaredConstructors
(注释复数)不带参数,而getDeclaredConstructor
接受Class<?>...
。你可能想要使用后者。
此外,正如托马斯·希尔兹所指出的那样,sessionObject
已经是Class
。因此,getClass()
上的Class
将产生Class
的{{1}},而不是Class
的{{1}}。
答案 1 :(得分:0)
如果sessionObject
是Class
,为什么还要打扰.getClass()
来电?不应:
sessionObject.getDeclaredConstructor(AsynchronousSocketChannel.class).newInstance(someAsyncSocketChannelObject);
足够?