2017-10-21 2 views
1

Ich möchte eine Methode in JAR ausführen, und die Methode sieht wie public static SomeType getValue() aus.Abrufen eines Werts von der Klasse in einer JAR-Datei

Ich versuchte Reflexion zu verwenden und es schien in Ordnung:

URLClassLoader classLoader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()}, Main.class.getClassLoader()); 
Class targetClass = classLoader.loadClass("some.package.TargetClass"); 
Class targetType = classLoader.loadClass("some.package.SomeType"); 
Method getValueMethod = targetClass.getMethod("getValue"); 

Aber während ein Rückgabewert wie folgt erhalten:

targetType value = targetClass.cast(getValueMethod.invoke(null)); 

value ‚s Art es sein kann, nicht targetType, nicht wahr? Allerdings ist die Art SomeType in der JAR-Datei, so kann ich wie SomeType value = ~~

Dann nicht tun, wie kann ich getValue() ‚s Wert bekommen richtig und Zugriff auf seine Daten?

+0

Auch mit Reflexion. Aber warum machst du das? Warum befindet sich die JAR-Datei nicht in Ihrem Klassenpfad? Was versuchst du auf einer höheren Ebene zu erreichen? –

+0

Weil 'jarFile' dynamisch geändert werden kann. Aber das Setzen eines Klassenpfads ist ein statischer Weg. – QueN

Antwort

0

Verwenden Sie die Schnittstelle, um den Rückgabewert einzuschränken.

Wenn der Rückgabewert keine Begrenzung hat, bedeutet dies, dass Sie alles darüber wissen. Also, was bedeutet deine 'dynamisch geladene'?

Abstrakt eine normale Schnittstelle SomeInterface und dann

SomeInterface value = targetClass.cast(getValueMethod.invoke(null)); 

Anderer Code nur für SomeInterface arbeiten, aber nicht wissen müssen, was tatsächlich ist. Es ist die Macht der Schnittstelle.

Verwandte Themen