get 没有参数的结构函数

2022-09-03 10:13:11

我似乎不能用于没有参数的构造函数。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"


答案 1

当你阅读 .getConstructor() 的 javadoc 时,问题很明显:

返回一个构造函数对象,该对象反映此类对象所表示的类的指定公共构造函数。

强调我的。

在代码中,构造函数不是公共的!

例:

// 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();
    }
}

强制链接到 SO 答案,该答案也提供了 JLS 参考。特别要注意,默认构造函数具有与类相同的访问修饰符。


答案 2

您的类似乎提供了一个不是默认构造函数的构造函数。不带参数的 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() 以包含正确的类型,或者在对象本身上提供默认构造函数(但是为什么要这样做?


推荐