2013-12-17 98 views
0

我採取誰檢查的「ID的」類和項目的方法獨特的IdChecker程序。 IdChecker只在編譯我的項目時運行......在我推送發行版之前。因爲我只需要映射我所有的類,然後調用MyClass.getField(「CLASS_ID」)。getShort(MyClass.getField(「CLASS_ID」));然後我創建一個包含className和classIdentifier的ClassWrapper。如何在我知道該類時正確調用方法?

對於方法,它更復雜一點,因爲我不能使用反射來訪問一個變量誰是本地的一個方法......但在我的項目,我用debuglogger記錄每個「進入方法」和「離開方法」。爲了得到局部變量我想調用一個方法,然後在我的日誌緩衝區讀取的最後一個條目(誰是「留下最法」日誌條目)從該日誌條目,我得到的METHOD_ID。

我的問題:

我不能調用類上的方法,它生成IllegalArgumentException ... 我不需要參數傳遞給方法,我只是想調用它們,我可以生成一個日誌條目。

private void getMethodsList() throws IllegalArgumentException, 
    IllegalAccessException, NoSuchFieldException, SecurityException { 
    final short METHOD_ID = 0x03; 
    /* Log-entering the method */ 
    mLogger.logDebug((byte) 1, METHOD_ID); 

    /* Create the MethodWrapper list corresponding 
     to each element of the ClassWrapper list */ 
    for(Class<?> clazz : mClasses) 
    { 
     /* Get the declared methods from each class */ 
     for(Method method : clazz.getDeclaredMethods()) 
     { 
      /* Get the name of the method */ 
      String newName = method.getName(); 
      short newIdentifier = 0; 
      try 
      { 
       method.invoke(clazz, new Object[]{null}); 
       /* Get the identifier of the class */ 
       newIdentifier = AbstractDebugLogger.mLastMethodID; 
      } 

     . 
     . 
     . 
+2

請閱讀'Method#invoke(..)'的javadoc。它非常清楚它期望什麼作爲論據。 –

+2

它可能是更正確使用自定義的註釋(例如'@MethodId(0×03)')這種情況。 –

回答

1

method.invoke(...)需要一個實際上可以用來調用該方法的參數數組。在這種情況下,您給它{null},它適用於接受單個對象但沒有其他函數的任何函數。要調用任意函數,你需要將參數列表的長度相匹配的功能需要的參數個數:

method.invoke(..., new Object[method.getParameterTypes().length]) 

這仍然有一些問題。首先,invoke的第一個參數不是您輸入的類,而是該類的對象的實例(對於靜態方法,則爲null)。您需要搜索類的構造函數,然後構造該類的實例,然後才能調用該類的實例方法。 第二個問題是,這並不需要原語功能,不能爲空工作。您可以檢查參數的類並根據需要將0替換爲null。 第三,最重要的問題,這就是,它是如此很難做到這一點的原因,是你實際上並不想調用的方法。您想要檢索有關方法的信息,在這種情況下恰好存儲在方法中。正確的解決方案是隻存儲附加到該方法的信息,附註:

@Retention(RetentionPolicy.RUNTIME) 
@interface ID { 
    int value(); 
} 
... 
@ID(1337) 
void exampleMethod() { ... } 
... 
newIdentifier = method.getAnnotation(ID.class).value(); //returns 1337 for exampleMethod 
+0

非常感謝你! – user3111783

相關問題