2017-02-17 46 views
2

我有一个超操作码和子类添加/ 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 
    } 
} 

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

感谢

+0

该特定类没有采用'com.sstangle.opCodes.OpCode $ OpEn'这样的构造函数。你可以显示“Add”类的构造函数吗? –

+0

@AndyTurner更新。 –

+3

问题是ctor不公开。尝试公开,或使用'getDeclaredConstructor'。 –

回答

3

看那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代替。

+0

你的意思是“ctor”的构造函数? –

+2

@GrzegorzGórkiewicz是的。 –

+1

“ctor”是“构造函数”的标准缩写形式。 –

相关问题