【问题标题】:How to inject an object into a class in a jar?如何将对象注入到 jar 中的类中?
【发布时间】:2015-01-16 20:50:26
【问题描述】:

我创建了一个已放入 jar 的 SocketClient 对象,我想在运行 java 程序时调用它,以便套接字启动,然后我可以通过外部应用程序连接到它。我将如何在程序开始时调用该对象。

套接字客户端

public class SocketClient {

    private boolean isCon = false;

    public SocketClient() {

    }

    public void communicate() {
        while(!isCon) {
            try {
                Socket socket = new Socket("localHost", 9090);
                System.out.println("Connected");
                isCon = true;
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                AbstractScript passScript = getAbstractScript();
                System.out.println("Passing Object");
                oos.writeObject(passScript);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    public AbstractScript getAbstractScript() throws Exception {
        Class reflectClass = AbstractScript.class;
        Object construct;
        construct = reflectClass.newInstance();
        AbstractScript newAbstractScript = (AbstractScript) construct;
        return newAbstractScript;
    }

    public boolean isRunningScript() throws Exception {
        Method method;
        Class reflectClass = AbstractScript.class;
        if(reflectClass != null) {
            method = reflectClass.getDeclaredMethod("isRunning", Boolean.class);
            try {
                Object returnValue = method.invoke(null);
                Boolean value = (Boolean) returnValue;
                return value;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return false;
    }
}

【问题讨论】:

  • “我创建了一个 SocketClient 对象,我已将其放入 jar 中。”这是什么意思?你做了一个类并编译它?如果是这样,只要 jar 在您的类路径上,它就会由类加载器加载。在这种情况下,您可以在应用程序中实例化一个 SocketClient 对象,然后像其他任何方式一样调用它。
  • 我有一个外部应用程序,我也正在添加功能,我假设只是将 .class 文件放入 jar 中,如果不调用它就不会运行。我需要调用它,但不知道如何调用。
  • 一般来说,要在罐子里装一个物体,你在外面做大部分的建筑,然后通过拉动索具把它竖起来。虽然有些人声称使用过镊子。

标签: java sockets code-injection


【解决方案1】:

让我们考虑一个可以帮助你做你想做的事情的简单例子。

假设您将SocketClient 类编译成一个名为MySocketStuff.jar 的jar 文件,并将您的外部应用程序打包到一个名为MyApplication.jar 的jar 中

为了让您的外部应用程序使用您的 SocketClient 类,您只需要在运行应用程序时确保 jar 在您的类路径中,这样类加载器就会加载这些类。

然后您可以像在任何其他开发环境中一样使用该类。

假设你的 main 方法有这样简单的东西:

import my.socket.stuff.package.SocketClient;  // you'll need the jar on your class path when you compile this file!

public class MyMainClass {
    public static void main(String[] args) {
        // instantiate the object
        SocketClient mySocketClient = new SocketClient(); // create the object
        // do stuff
        mySocketClient.communicate();
        // ...
    }
}

一旦你编译了这个 jar(你可以决定是否要在 jar 中包含导入的类...),你可以像这样从命令行调用你的程序:

java -cp "<path to MySocketStuff.jar>;<path to MyApplication.jar>" MyMainClass

这有帮助吗?

【讨论】:

  • 是否可以在“MyApplication.jar”上使用反射并通过套接字发送它?
  • @JordanFlorchinger 我不确定您所说的“在 MyApplication.jar 上”是什么意思,但您当然可以使用反射从主应用程序中创建您想要的任何对象,但实际上只需要当您在编译时不知道对象的类型时完成,或者当您运行时库并不总是存在。似乎是您过于复杂的用例,但我不确定。
  • 我只是指您提供的示例。我将运行多个相同的应用程序,并且我需要能够获取它们是否已加载,从这个意义上说,加载不仅仅意味着进程是否可见。
  • 看到您最初的问题是“我如何在另一个 jar 中调用一个类”,这就是您的做法。你把这个类放在一个罐子里,然后把它放在类路径上。您如何实例化对象完全取决于您,反射或其他方式,您只需要在类路径中有 jar。如果类路径中没有它,则需要使用类加载器从磁盘读取 jar 文件,然后自己加载类。
猜你喜欢
  • 2012-10-06
  • 1970-01-01
  • 2012-09-07
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多