2010-12-23 13 views
1

我正在編寫一個應用程序,該應用程序在未知應用程序中的未知類的字段中搜索信號量類型(由用戶傳遞)。我用反射做了它,它工作。反思:從一個未知的正在運行的應用程序獲取值

現在我想用這些未知應用程序的運行實例來填充這些信號量的值。所以我把這個未知的應用程序的「主」方法的類,做了的newInstance,並通過調用它的主要方法來啓動應用程序時:

Class mainClass = getItSomeWhere(); 
Object instance = mainClass.newInstance(); 
Method mainMethod = mainClass.getDeclaredMethod("main", new Class[]{String[].class}); 
mainMethod.invoke(instance, new Object[]{args}); 

它工作得很好。

現在,當我只有一個主類的實例時,我該如何獲得信號量值,從這個正在運行的應用程序的類中取得它們?

非常感謝您的答覆。

+0

你甚至不需要創建實例。主要方法是靜態的,所以你可以在沒有實例傳遞null的情況下調用它。 – AlexR 2010-12-23 10:11:26

+0

當你說「信號量」時,你是什麼意思?同步塊? – AlexR 2010-12-23 10:11:59

回答

0

@AlexR:

我知道這是一個有點incomprensible,我會試着解釋:

如果一個應用程序的mainClass作出這樣的:

public class MainClass{ 

     public static void main(String [] args){ 
        new Gui(); 
     } 
} 

並且您通過Reflection啓動主要方法,則無法獲取Gui的字段值,也不能獲得Gui具有的類的實例等。

你明白這個問題嗎?


編輯: AlexR,謝謝你讓我知道,從Jacarta BCEL,它幫我解決這個問題!

學習如何使用它,我編輯了所有應用程序類文件,其中有一條new Semaphore();行,並且我用自定義的Semaphore擴展類替換了它,讓我獲取該值,並將其傳遞給觀察者對象!

非常感謝,新年快樂!

0

好吧,信號量只是其他類的一個類。如果你的意思類型信號的一流水平的情況下,它是簡單的(完全是你處理其他類型的類級變量):

Class clazz = ... 
for (Field f : clazz.getDeclaredFields()) { 
    if (f.getType().equals(Semaphore.class)) { 
     // do what you want here. 
    } 
} 

但是,如果你想對付定義爲方法變量,你必須使用一個字節代碼工程庫(例如雅加達的BCL)。

BTW你真的不應該創建類的實例,其中包含你的主要方法:

  • 你不知道打電話與參數,這些參數的構造函數。
  • 類可能是抽象的,所以你根本不能實例化它。
相關問題