对于没有参数的构造函数,我似乎不能使用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"。
发布于 2014-12-20 12:01:33
当您阅读.getConstructor()时,问题很明显。
返回一个构造器对象,该对象反映此类表示的类的指定公共构造函数。
强调我的。
在您的代码中,构造函数不是公共的!
示例:
// Note: class is NOT public -- its default constructor won't be either
final class Test
{
public static void main(final String... args)
throws NoSuchMethodException
{
// throws NoSuchMethodException
Test.class.getConstructor();
}
}强制性link to an SO answer,这也提供了JLS的参考。特别要注意的是,默认构造函数具有与类相同的访问修饰符。
发布于 2014-12-20 12:00:22
您的类似乎提供了一个不是默认构造函数的构造函数。不带参数的对getConstructor()的调用要求该类具有默认构造函数。下面的测试说明了这一点。
import org.junit.Test;
public class ConstructorTest {
public static class ClassWithParameterizedConstructor {
public ClassWithParameterizedConstructor(final String param) {
// A parameterized constructor, no default constructor exists
}
}
@Test
public void testFoo() throws NoSuchMethodException {
// Parameterized constructor lookup works fine
ClassWithParameterizedConstructor.class.getConstructor(String.class);
// This doesn't work since there is no default constructor
ClassWithParameterizedConstructor.class.getConstructor();
}
}因此,一个可能的解决方案是要么更改对getConstructor()的调用以包含正确的类型,要么为对象本身提供默认构造函数(但是为什么要这样做呢?)
发布于 2014-12-20 12:05:18
读这个:http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
类类和构造函数似乎都有newInstance方法--区别在于,在类类中,您只能调用没有参数的newInstance,因此被调用的构造函数必须有无参数(这在有多个构造函数时也会带来问题)。Constructor类中的newInstance允许您调用带有参数的构造函数,请注意,您还可以使用getConstructors方法,而不是返回所有类构造函数的getConstructor方法,并允许您调用所需的构造函数方法。
在这种情况下,由于您只有一个构造函数,并且没有参数,所以Class.newInstance可以正常工作。要使用getConstructor获得相同的结果,您需要添加最后的oCon.newInstance();
https://stackoverflow.com/questions/27579783
复制相似问题