java - 根据 "Class"创建一个类的新实例

标签 java

我相信这可以使用反射来完成,但在一个简单的示例中,这就是我想要完成的任务。

我有一个名为“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/

相关文章:

java - org.apache.jena.atlas.web.HttpException : 405 - HTTP method POST is not supported by this URL

java - 重写 toString() 是否被视为多态?

java - 在 maven 上运行时出现 OutOfMemory Java 堆空间,即使内存已增加

java - 为什么导入到eclipse中的maven项目没有得到 "Maven Dependencies"列表?

java - 在 HashMap<String,ArrayList<Model>> 中遇到问题,(在 Android 中创建评论 View )

java - 如何在 java 类中获取 OneDriveClient 对象

java - 从 JTextArea 控件访问换行属性

java - 为什么textView.setTextColor()只支持10个字符的颜色名称?

java - 如何检查字符串数组中的每个元素是否为整数?

java - 使用 Jersey Tomcat 服务获取 404 错误