Java 如何访问位于字符串中定义的包中的静态类?

Java 如何访问位于字符串中定义的包中的静态类?,java,plugins,jar,Java,Plugins,Jar,澄清一下:我正在为我的应用程序编写一个插件框架。我的应用程序和插件都是jar文件。目前,我使用一个脚本将插件文件合并到应用程序jar中,这些插件最终位于包中:com.crimson.server.plugins。我需要能够访问插件文件,但我不能做硬编码的软件包。例如:com.crimson.server.plugins.nst.Plugin。我唯一能想到的另一件事是将插件作为jar,然后以某种方式加载它们。如何做到这一点?您可以使用。它用于描述能够检查同一系统(或自身)中其他代码的代码 下面是一

澄清一下:我正在为我的应用程序编写一个插件框架。我的应用程序和插件都是jar文件。目前,我使用一个脚本将插件文件合并到应用程序jar中,这些插件最终位于包中:com.crimson.server.plugins。我需要能够访问插件文件,但我不能做硬编码的软件包。例如:com.crimson.server.plugins.nst.Plugin。我唯一能想到的另一件事是将插件作为jar,然后以某种方式加载它们。如何做到这一点?

您可以使用。它用于描述能够检查同一系统(或自身)中其他代码的代码

下面是一个如何从字符串创建类实例的示例

import com.stakoverflow.plugin.MyPluginClass;

public class Main {

    public static void main(String[] args) {
        String myclass = "com.stakoverflow.plugin.MyPluginClass";
        try {
            Class clazz = Class.forName(myclass);

                MyPluginClass myPlugin = (MyPluginClass) clazz.newInstance();
                myPlugin.helloWorld();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
以下是MyPluginClass的定义:

package com.stakoverflow.plugin;

public class MyPluginClass {

    public void helloWorld() {
        System.out.println("Hello world!");
    }
}

当然,在本例中,类必须位于类路径中。否则类加载器将无法找到它。但是可以将dynamicali加载到jar中。

正如@JEY所提到的,您应该使用反射API或现有的模块框架,如OSGi

在反射的情况下,您感兴趣的类是类加载器及其后代(URLClassLoader,它可以从JAR加载类)。拥有类加载器后,可以使用class.forName(name、true、classLoader)加载类并访问它们


对于OSGi,您可以使用Spring OSGi或直接使用API以更声明的方式进行操作。

我用一个简单的示例编辑了我的答案。之后,您将需要阅读api文档。