2013-02-07 29 views
1

這段代碼可以讓我運行一個罐子是我計劃的一部分:Java反射。運行一個外部jar並引用其類?

File f = new File("client.jar"); 
URLClassLoader cl = new URLClassLoader(new URL[]{f.toURI().toURL(), null}); 
Class<?> clazz = cl.loadClass("epicurus.Client"); 
Method main = clazz.getMethod("main", String[].class); 
main.invoke(null, new Object[]{new String[]{}}); 

反正是有,我可以指的是外部程序的類?
我希望能夠改變它的JFrame的標題。

+0

title屬性位於JFrame的**實例**上,而不是類。雖然您可以使用反射來檢查類,但您無法操作實例。 –

+0

@SteveH。 - 呃?當然,你可以......這是反思的一點。 'Field.set(objInstance,fieldValue)'...你去了,我只是操縱了一個實例。 –

+0

@BrianRoach你是對的 - 也許我應該說你不能「獲得」實例。你怎麼知道一個新的JFrame被創建,你會在哪裏獲得參考?我的假設是jar文件是未知的 –

回答

3

我相信你可以。我會嘗試如下。

調用main之後,您需要運行一個循環來訪問您感興趣的窗口(可以在單獨的線程中完成)。

for(Window window : Window.getWindows()){ 
    if(window != null && window.isVisible() && window instanceof JFrame){ 
     JFrame jFrame = (JFrame)window; 
    } 
} 

然後,您可以訪問Jframe的字段和方法(或如果必要的話,指定要修改的框架是你打算通過比較jFrame.getName的一個()和一些字符串)通過反射。

例如說你有興趣修改JTextArea中的字體大小和樣式。

Field textAreaField = jFrame.getClass().getDeclaredField("textArea"); 
textAreaField.setAccessible(true); 

允許您訪問該字段並允許您以任何您認爲合適的方式對其進行修改。

從那裏你將需要實際的對象。

JTextArea textArea = (JTextArea) textAreaField.get(jFrame); 

Font font = textArea.getFont(); 
textArea.setFont(new Font(font.getFontName(), font.getStyle(), 24)); 

而這應該只是爲你做。