首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无参数getConstructor

无参数getConstructor
EN

Stack Overflow用户
提问于 2014-12-20 11:33:08
回答 5查看 32.7K关注 0票数 15

对于没有参数的构造函数,我似乎不能使用getConstructor

我一直有以下例外情况:

代码语言:javascript
复制
java.lang.NoSuchMethodException: classname.<init>()

以下是代码:

代码语言:javascript
复制
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"

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-12-20 12:01:33

当您阅读.getConstructor()时,问题很明显。

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

强调我的。

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

示例:

代码语言:javascript
复制
// 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的参考。特别要注意的是,默认构造函数具有与类相同的访问修饰符。

票数 27
EN

Stack Overflow用户

发布于 2014-12-20 12:00:22

您的类似乎提供了一个不是默认构造函数的构造函数。不带参数的对getConstructor()的调用要求该类具有默认构造函数。下面的测试说明了这一点。

代码语言:javascript
复制
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()的调用以包含正确的类型,要么为对象本身提供默认构造函数(但是为什么要这样做呢?)

票数 2
EN

Stack Overflow用户

发布于 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();

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27579783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档