2017-02-17 71 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」是「構造函數」的標準縮寫形式。 –

相關問題