2013-02-07 2 views
1

Cet extrait de code me permet d'exécuter un pot dans le cadre de mon programme:Réflexion Java. Exécuter un pot externe et se référant à ses classes?

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[]{}}); 

Y at-il de toute façon que je peux faire référence aux cours de ce programme externe?
Je veux pouvoir changer le titre de son JFrame par exemple.

+0

L'attribut title est sur ** instances ** de JFrame, pas la classe. Alors que vous pouvez inspecter des classes avec la réflexion, vous ne pouvez pas manipuler des instances. –

+0

@SteveH. - Hein? Bien sûr, vous pouvez ... c'est un peu le point de réflexion. 'Field.set (objInstance, fieldValue)' ... là vous allez, j'ai juste manipulé une instance. –

+0

@BrianRoach vous avez raison - peut-être devrais-je dire que vous ne pouvez pas "obtenir" des instances. Comment sauriez-vous qu'un nouveau JFrame a été créé et où obtiendriez-vous la référence? Mon hypothèse est que le fichier jar est inconnu –

Répondre

3

Je crois que vous pourriez. Je tenterais comme suit. Après avoir invoqué la commande principale, vous devrez exécuter une boucle pour accéder à la fenêtre qui vous intéresse (cela peut être fait dans un fil séparé).

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

Vous pouvez alors accéder aux champs et méthodes du JFrame (ou le cas échéant, préciser que le cadre que vous modifiez est celui que vous avez l'intention en comparant jFrame.getName() et une chaîne) par réflexion. Par exemple, vous êtes intéressé par la modification de la taille et du style de la police dans un JTextArea.

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

Permet d'accéder au champ et vous permet de le modifier comme bon vous semble.

De là, vous aurez besoin de l'objet actuel.

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

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

Et cela devrait à peu près le faire pour vous.

Questions connexes