我好像用不了 getConstructor
对于没有参数的构造函数。
我不断得到以下例外:
java.lang.NoSuchMethodException: classname.<init>()
代码如下:
interface InfoInterface {
String getClassName();
String getMethodName();
String getArgument();
}
class asa implements InfoInterface {
@Override
public String getClassName() {
return ("jeden");
}
@Override
public String getMethodName() {
return ("metoda");
}
@Override
public String getArgument() {
return ("krzyk");
}
}
class Jeden {
Jeden() {
System.out.println("konstruktor");
}
public void Metoda(String s) {
System.out.println(s);
}
}
class Start {
public static void main(String[] argv) {
if (argv.length == 0) {
System.err.println("Uzycie programu: java Start nazwa_klasy nazwa_klasy2...");
return;
}
try {
for (int x = 0; x < argv.length; x++) {
Class<?> c = Class.forName(argv[x]);
InfoInterface d = (InfoInterface) c.newInstance();
String klasa = d.getClassName();
String metoda = d.getMethodName();
String argument = d.getArgument();
Class<?> o = Class.forName(klasa);
// o.newInstance();
Constructor<?> oCon = o.getConstructor();
System.out.println("ASD");
Class<?> p = (Class<?>) oCon.newInstance();
}
} catch (Exception e) {
System.out.println(e);
}
}
}
``` `o.newInstance();` 印刷品 `"konstruktor"` 没有问题。
5条答案
按热度按时间kyks70gy1#
在这个(有些复杂)的场景中,实际上可以通过替换以下内容来获得(非公共)构造函数:
具有
的“默认”可见性
Jeden
类(及其构造函数)使Start
类,因为它是在同一个包中定义的。qhhrdooz2#
请阅读以下内容:http://docs.oracle.com/javase/tutorial/reflect/member/ctorinstance.html
似乎两个类class和constructor都有newinstance方法不同的是,在class类中,您只能在没有参数的情况下调用newinstance,因此被调用的构造函数必须有一个no参数(当您有多个构造函数时,这也会带来问题)。构造函数类中的methoe newinstance允许您使用参数调用构造函数,请注意,您还可以使用getconstructors方法而不是getconstructor方法,该方法返回所有类构造函数,并允许您调用所需的构造函数方法。
在本例中,由于您只有一个构造函数并且没有参数,class.newinstance可以正常工作。要使用getconstructor获得相同的结果,您需要在endocon.newinstance()中添加;
wnvonmuf3#
你可以用
getDeclaredConstructors()
它返回一个构造函数对象数组,反映由该类对象表示的类声明的所有构造函数如果你有这样的私有构造函数:
必须为构造函数设置可访问性:
得到这样的结果:
注意:如果您的类声明为
private
他的默认构造函数必须是private
我也是。并且要注意接收外部类示例的非静态内部类
uttx8gqw4#
当您阅读
.getConstructor()
:返回一个构造函数对象,该对象反映由该类对象表示的类的指定公共构造函数。
我的。
在您的代码中,构造函数不是公共的!
例子:
与so答案的强制性链接,也提供jls参考。特别要注意的是,默认构造函数与类具有相同的访问修饰符。
taor4pac5#
似乎您的类提供了一个不是默认构造函数的构造函数。不带参数的getconstructor()调用要求类具有默认构造函数。下面的测试说明了这一点。
因此,一个可能的解决方案是要么更改对getconstructor()的调用以包含正确的类型,要么在对象本身上提供一个默认构造函数(但是为什么要这样做呢?)。