2013-08-25 186 views
0

我從硬盤讀取了一些工廠類。如何從多個私人構造函數中反映私人構造函數

那些工廠沒有公共構造函數,它們有2個私有構造函數: 一個用於反射的構造函數和一個用於創建的構造函數。

此代碼工作時,只有一個公共的構造,但因爲它是它拋出一個奇怪的例外:

public static void setupCalculators() 
{ 
    String calculatorsBasePackage = "feature.calculators"; 
    ArrayList<String> res; 
    try 
    { 
     res = ReflectionHelper.getClassNamesFromPackage(calculatorsBasePackage); 

     for (String file : res) 
     { 
      file = file.replace("/", ""); 
      Class<?> klass = Class.forName(calculatorsBasePackage + "." + file); 

      //The exception happens on the following line: 
      Constructor<?> c = klass.getDeclaredConstructor((Class[])null); 


      c.setAccessible(true); 
      ICalculatorFactory calculatorFactory = 
       (ICalculatorFactory) c.newInstance((Object[])null); 

      addCalculator(file.replace("_Calculator", ""), calculatorFactory); 
     } 
    } 
    catch (IOException | ClassNotFoundException | SecurityException | 
      IllegalArgumentException | InstantiationException | 
      IllegalAccessException | InvocationTargetException | 
      NoSuchMethodException e) 
    { 
     e.printStackTrace(); 
    } 
} 

這是要檢查的類:

private POS_F_Calculator() 
{ 
} 

private POS_F_Calculator() 
{ 
}  
private POS_F_Calculator(StructureRepresentation representation) 
{ 
    this.representation = representation; 
} 

@Override 
public ICalculator newCalculator(IRepresentation representation) 
{ 
    return new POS_F_Calculator((StructureRepresentation) representation); 
} 

這裏是拋出的異常:

java.lang.NoSuchMethodException: feature.calculators.POS_F_Calculator$1.<init>() 
    at java.lang.Class.getConstructor0(Unknown Source) 
    at java.lang.Class.getDeclaredConstructor(Unknown Source) 
    at feature.CalculatorHandler.setupCalculators(CalculatorHandler.java:37) 
    at driver.Driver.main(Driver.java:36) 

我'我試圖弄清楚我做錯了什麼。這個例外是什麼意思?

回答

0

的一點點研究後: 其中一個類有它一個Runnable的實現,並編譯成一個匿名類 POS_F_Calculator $ 1

解決方案: 既然有非常具體的命名我將丟棄不使用特定命名的類。

-1
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 
            throws NoSuchMethodException, 
             SecurityException 

link

(類[])空

。你怎麼投null!?當空是不是一類

+0

嗯,這是事情我」一在堆棧溢出中已經看到了提示並被接受,並且它不是一個語法錯誤,因爲java編譯並運行它...它不適用於這部分代碼並且沒有它... –

+0

當然 您可以。您可以將null轉換爲任何內容。 -1 – EJP

0

構造函數c = klass.getDeclaredConstructor((Class [])null);/*這裏是例外*/

這裏你說你想要的構造函數有零參數。你實際上有構造函數有一個參數:

私人POS_F_Calculator(StructureRepresentation表示)

因此調用閱讀:

Constructor<?> c = klass.getDeclaredConstructor(StructureRepresentation.class); 
+0

對不起,我沒有注意到我沒有複製這兩個構造函數。我的錯。我編輯了這個問題。 –

+0

答案保持不變。您尚未正確指定構造函數參數列表。 – EJP

+0

對不起,但你錯了。該列表被正確指定,並且在我忽略內部類和匿名類(在編譯時具有$符號的類)之後,所有工作都很好。 –