【发布时间】:2021-09-26 10:45:54
【问题描述】:
假设我有一个父类和一个扩展我的父类的子类,并且我有以下代码。
public class SomeClass {
private Parent myParent;
public SomeClass(Parent myParent) {
this.myParent = myParent;
}
}
为什么允许这样做
Class<SomeClass> clazz = SomeClass.class;
SomeClass someClass = clazz.getConstructor(Parent.class).getInstance(Child);
这不是
Class<SomeClass> clazz = SomeClass.class;
SomeClass someClass = clazz.getConstructor(Child.class).getInstance(Child);
第二个抛出 NoSuchMethodeException。为什么在这种情况下没有动态绑定但是使用普通的构造函数动态绑定就可以了? 有没有办法解决这个问题?
编辑:
我正在尝试在运行时加载 jar 文件。此时我有我需要的类,加载了URLClassLoader 。接下来,我想创建一个已加载类的新实例。要创建实例,我调用urlClassLoader.loadClass(nameOfClass).getConstructor(parameterType).newInstance(initArguments);
在这种情况下,parameterType 将是 child.class。
【问题讨论】:
-
"为什么在这种情况下没有动态绑定,但是使用普通的构造函数动态绑定就可以了?" - From
Class::getConstructor's documentation: "返回一个Constructor对象,它反映了此Class对象所表示的类的指定公共构造函数。parameterTypes参数是一个Class对象数组,用于标识构造函数的形参类型,在声明的顺序...” -
@Turing85 谢谢,但是为什么 java 不能确定孩子是否属于父类型?我应该如何解决这个问题?
-
@ufukguenes 谁说java不能?这不是这种确切方法的作用。这样做很可能是为了避免歧义,如果一个类扩展了另一个类并实现(至少一个)接口,就会发生歧义。
-
如果您能告诉我们您想要做什么,我们或许可以为您提供更好的帮助。在使用 getConstructor(...) 方法时,没有特定的方法可以告诉 Java“检查是否有一个构造函数接受这种类型的超类型作为参数”。但是,Java 将允许您在调用
SomeClass构造函数时传递Child的实例,例如在表达式new SomeClass(childInstance)中。
标签: java class constructor classloader