【问题标题】:How to invoke a Java class of another Jar file?如何调用另一个 Jar 文件的 Java 类?
【发布时间】:2015-12-10 08:41:36
【问题描述】:

我想接收结果,动态调用另一个 jar 中的类。

例如,

名为 A.jar 的文件中的“A”目录。

名为 B.jar 的文件中的“B”目录。

我想动态调用A.jar文件类到B.jar文件。

这是A.jar文件的主类。

由于消息交换技术,不考虑Socket和RMI。

主类(B.jar)

public class main {
public static void main(String[] args) {
    //It dynamically creates an object of a Message Class in A.jar.
    //And it invoke the getMessage function.
    //And Save the return value.

}}

消息类(A.jar)

public class message{
    public String getMessage(){ 

       return "Hello!";
    }
}

【问题讨论】:

  • dynamically,您的意思是将类名作为字符串?我们可以假设A.jar 在类路径上吗?
  • 是的。就是通过类名(字符串)调用A.jar的类。
  • 是否可以访问另一个jar文件中的任何类?
  • 类作为字符串调用是没有问题的。我想知道,如何动态调用另一个jar文件中的类

标签: java reflection jar invoke


【解决方案1】:

首先,您需要动态创建给定类的实例:

Class<?> clazz = Class.forName("message");
Object messageObj = clazz.newInstance();

这假定包含message 类的.jar 文件位于classpath 上,以便Java 运行时能够找到它。否则,您需要通过类加载器手动加载 jar 文件,例如比如How should I load Jars dynamically at runtime?。假设包含message 类的A.jar 文件位于c:\temp\A.jar,您可以使用类似

URLClassLoader child = new URLClassLoader (
        new URL[] {new URL("file:///c:/temp/A.jar")}, main.class.getClassLoader());
Class<?> clazz = Class.forName("message", true, child);

加载 jar 文件并从中加载消息类。

在这两种情况下,您都可以从类中检索方法并在创建的实例上调用它:

Method getMessage = clazz.getMethod("getMessage");
String result = (String) getMessage.invoke(messageObj);

【讨论】:

  • 感谢您的回答。如何调用另一个 jar 文件中的类?
  • 只要其他 jar 文件在类路径中,上述方法就有效。否则需要通过类加载器在运行时动态加载jar文件。
  • 我不确定如何处理给定的答案。我在哪里可以找到一个很好的实用示例。
  • 我仍然不清楚您的实际问题 - 您的 A.jar 文件是否在您的类路径中?如果是这样,您可以实例化从A.jarClass.forName 的任何公共类。否则需要通过类加载器加载A.jar
  • 我想要什么,我想动态调用另一个 jar 文件,不管类路径如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多