【问题标题】:Reflectively instantiate class with constructor which takes Enum [duplicate]使用带有枚举的构造函数反射性地实例化类[重复]
【发布时间】:2017-02-17 20:14:02
【问题描述】:

我有一个超类 OpCode 和子类 Add/And..etc

我正在尝试根据类名字符串反思性地构造子类。构造函数采用超类中定义的枚举。

我正在尝试:

OpCode theOpCode = (OpCode) Class.forName("com.sstangle.opCodes." + opCodeName).getConstructor(OpCode.OpEn.class).newInstance(opEn);

导致

java.lang.NoSuchMethodException: com.sstangle.opCodes.Add.<init>(com.sstangle.opCodes.OpCode$OpEn)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getConstructor(Unknown Source)

添加类是

public class Add extends OpCode {
    Add(final OpEn opEn) {
        super(opEn);
        this.assemblyCommand = "ADD";
    }
}

操作码类是

public abstract class OpCode {
    OpCode(final OpEn opEn) {
        this.opEn = opEn;
    }
    public static enum OpEn {
        I, MI, MR, RM, ZO
    }
}

如何正确访问采用枚举的构造函数?

谢谢

【问题讨论】:

  • 那个特定的类没有这样的构造函数采用com.sstangle.opCodes.OpCode$OpEn。你能展示Add类的构造函数吗?
  • @AndyTurner 已更新。
  • 问题是 ctor 不是公开的。尝试将其公开,或使用getDeclaredConstructor
  • ctor 必须是公开的,而不仅仅是类。
  • doh,是的。谢谢

标签: java reflection constructor enums


【解决方案1】:

source code of Class.getConstructor

public Constructor<T> getConstructor(Class<?>... parameterTypes)
    throws NoSuchMethodException, SecurityException {
    checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
    return getConstructor0(parameterTypes, Member.PUBLIC);
}

Member.PUBLIC 告诉 getConstructor0 方法只返回一个公共构造函数。

private Constructor<T> getConstructor0(Class<?>[] parameterTypes,
                                    int which) throws NoSuchMethodException
{
    Constructor<T>[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC));
    for (Constructor<T> constructor : constructors) {
        if (arrayContentsEq(parameterTypes,
                            constructor.getParameterTypes())) {
            return getReflectionFactory().copyConstructor(constructor);
        }
    }
    throw new NoSuchMethodException(getName() + ".<init>" + argumentTypesToString(parameterTypes));
}

privateGetDeclaredConstructors 采用一个名为 publicOnly 的布尔参数:

private Constructor<T>[] privateGetDeclaredConstructors(boolean publicOnly)

要么使用构造函数public,要么改用getDeclaredConstructor

【讨论】:

  • 你的意思是“ctor”的构造函数?
  • @GrzegorzGórkiewicz 是的。
  • “ctor”是“constructor”的标准缩写形式。
  • @LewBloch 就是这样,我倾向于快速输入,但我不介意扩展它。
  • 我刚刚用谷歌搜索了它¯_(ツ)_/¯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多