首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getConstructor在Java中抛出NoSuchMethodException

getConstructor在Java中抛出NoSuchMethodException
EN

Stack Overflow用户
提问于 2020-10-15 20:44:22
回答 1查看 124关注 0票数 3

我对Java非常陌生,所以这可能是一个愚蠢的问题,但我正在尝试理解如何通过从现有实例中获取类来创建类的新实例(我认为这称为反射)。

目前我有一个超类和它的几个子类。

代码语言:javascript
复制
public abstract class SuperClazz {...}

public class SubClazz1 extends SuperClazz {...}

public class SubClazz2 extends SuperClazz {...}

我有一个这些子类的现有实例(只声明为超类的成员,因为我还不知道它属于哪个子类)。我正在尝试获取这个现有实例所属的子类,并创建同一子类的一个新实例。

这是我的设置:

代码语言:javascript
复制
private SuperClazz oldSubInstance;
private SuperClazz newSubInstance;

newSubInstance = oldSubInstance.getClass().getConstructor(String.class, char.class, int.class).newInstance("abc", 'e', 6);

这抛出了NoSuchMethodException。

我很困惑,因为我知道SuperClazz有一个构造函数,它接受三个参数,一个字符串,一个字符和一个整型。我查看了答案herehere,但发现实施建议的修复程序不起作用,或者他们的问题不适用于我的情况。

我是不是完全误解了getConstructor的工作原理?

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 21:04:08

您需要确保在子类中存在all-args构造函数。

以下示例创建一个newSubInstance

代码语言:javascript
复制
// using Lombok annotations for brevity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
abstract class SuperClazz {
    private String str;
    private char chr;
    private int x;

    // getters/setters/default and all-args constructors provided by Lombok
}


class SubClazz1 extends SuperClazz {
    public SubClazz1(String str, char c, int i) { // providing constructor in the child class
        super(str, c, i);
    }
}

// test
SuperClazz oldSubInstance = new SubClazz1("def", 'g', 10);
SuperClazz newSubInstance;

newSubInstance = oldSubInstance.getClass()
                               .getConstructor(String.class, char.class, int.class)
                               .newInstance("abc", 'e', 6);

System.out.println(newSubInstance);

输出(在基类级别重写toString):

代码语言:javascript
复制
SuperClazz(str=abc, chr=e, x=6)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64371880

复制
相关文章

相似问题

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