2017-10-21 103 views
1

Je souhaite exécuter une méthode dans JAR et la méthode ressemblera à public static SomeType getValue().Obtention d'une valeur de la classe dans un fichier JAR

J'ai essayé d'utiliser la réflexion et il semblait bien:

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"); 

Mais tout en obtenant une valeur de retour comme ceci:

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

value ne peut pas être targetType, non? Cependant, le type SomeType est dans le fichier JAR, donc je ne peux pas faire comme SomeType value = ~~

Alors, comment puis-je obtenir la valeur de getValue() correctement et accéder à ses données?

+0

Utilisation de la réflexion aussi. Mais pourquoi fais-tu ça? Pourquoi le fichier jar n'est-il pas dans votre classpath? Qu'est-ce que vous essayez d'atteindre, à un niveau supérieur? –

+0

Parce que jarFile peut être modifié dynamiquement. Mais définir un classpath est une manière statique. – QueN

Répondre

0

Utilisez l'interface pour restreindre la valeur de retour.

Si la valeur de retour n'a pas de limite, vous opérez sur elle signifie que vous savez tout à son sujet. Alors, quelle est la signification de votre «chargé dynamique»?

Résumé d'une interface normale SomeInterface, puis

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

Autre code ne fonctionne que pour SomeInterface mais ne pas besoin de savoir ce qu'il est réel. C'est le pouvoir de l'interface.