基于其“类”创建类的新实例

时间:2015-05-30 03:59:08

标签: java

我相信这可以通过反射来完成,但在一个简单的例子中,这就是我想要完成的事情。

我有一个名为“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   原因:实际和正式的参数列表长度不同

2 个答案:

答案 0 :(得分:1)

  

假设"会话"和#34; NewSession"具有相同的构造函数,我将如何区分这两个构造函数并基于它的类创建一个新实例。

Object.getClass()返回与派生(特定)类型最相应的Class对象。

因此,如果您在getClass()的实例上致电NewSession,您将获得与Class对应的NewSession对象。

您无法从Session构造函数创建NewSession对象,反之亦然。因此,getDeclaredConstructorsClass没有歧义。

  

错误:(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)

如果sessionObjectClass,为什么还要打扰.getClass()来电?不应:

sessionObject.getDeclaredConstructor(AsynchronousSocketChannel.class).newInstance(someAsyncSocketChannelObject);

足够?