Java 是否可以使用不在生成中的.class文件?

Java 是否可以使用不在生成中的.class文件?,java,Java,我想添加一个系统,从外部向我的程序添加更多命令 基本上,一个与我的jar可执行文件位于同一目录中的文件夹可以有不同数量的扩展 每个扩展名都是一个.class文件,它扩展了某个抽象类,该抽象类定义了用于标识的方法等 然而,我似乎无法确定是否有可能从主包外部控制这些.class文件 这可能吗?如果是,怎么做?如果没有的话,我还有别的选择吗 谢谢 这是可能的 jar只是压缩的类文件 只要类文件在类路径中,就可以了 将jar文件从.jar解压为.zip,然后解压以查看java包的目录结构。这是可能的 j

我想添加一个系统,从外部向我的程序添加更多命令

基本上,一个与我的jar可执行文件位于同一目录中的文件夹可以有不同数量的扩展

每个扩展名都是一个.class文件,它扩展了某个抽象类,该抽象类定义了用于标识的方法等

然而,我似乎无法确定是否有可能从主包外部控制这些.class文件

这可能吗?如果是,怎么做?如果没有的话,我还有别的选择吗

谢谢

这是可能的

jar只是压缩的类文件

只要类文件在类路径中,就可以了

将jar文件从.jar解压为.zip,然后解压以查看java包的目录结构。

这是可能的

jar只是压缩的类文件

只要类文件在类路径中,就可以了


将jar文件从.jar解压为.zip,然后解压以查看java包的目录结构。

确保可以在运行时加载类并创建类对象:

见此:


请参阅。

确保可以在运行时加载类并创建类对象:

见此:


就我所知,请参见。

。你想建立一个插件系统。 如果是这样,您应该考虑java服务提供者方法

在这种方法中,您可以在主应用程序中定义服务提供者接口SPI 打包并使用java META-INF/services位置查找实现。 在这种情况下,只需在类路径上放置一个jar文件,就可以添加扩展

从java 1.6开始,您可以使用java.util.ServiceLoader

或者看看apache discovery

它比java.util.SerivceLoader更强大,因为它允许您将构造函数参数传递给它实例化的服务

可能的插件加载器实现如下所示:

public interface ServiceInterface {

}

public class PluginHost {   

    public ServiceLoader<ServiceInterface> loadPlugins() {
        File[] pluginLibraries = getPluginLibraries();
        URL[] pluginLibUrls = new URL[pluginLibraries.length];

        for (int i = 0; i < pluginLibUrls.length; i++) {
            try {
                pluginLibUrls[i] = pluginLibraries[i].toURI().toURL();
            } catch (MalformedURLException e) {
                throw new IllegalStateException("Unable to load plugin: "
                        + pluginLibraries[i], e);
            }
        }

        URLClassLoader pluginsClassLoader = new URLClassLoader(pluginLibUrls,
                ServiceInterface.class.getClassLoader());

        ServiceLoader<ServiceInterface> serviceLoader = ServiceLoader.load(
                ServiceInterface.class, pluginsClassLoader);

        return serviceLoader;
    }

    private File[] getPluginLibraries() {
        // please implement
    }
}

据我所知,是你。你想建立一个插件系统。 如果是这样,您应该考虑java服务提供者方法

在这种方法中,您可以在主应用程序中定义服务提供者接口SPI 打包并使用java META-INF/services位置查找实现。 在这种情况下,只需在类路径上放置一个jar文件,就可以添加扩展

从java 1.6开始,您可以使用java.util.ServiceLoader

或者看看apache discovery

它比java.util.SerivceLoader更强大,因为它允许您将构造函数参数传递给它实例化的服务

可能的插件加载器实现如下所示:

public interface ServiceInterface {

}

public class PluginHost {   

    public ServiceLoader<ServiceInterface> loadPlugins() {
        File[] pluginLibraries = getPluginLibraries();
        URL[] pluginLibUrls = new URL[pluginLibraries.length];

        for (int i = 0; i < pluginLibUrls.length; i++) {
            try {
                pluginLibUrls[i] = pluginLibraries[i].toURI().toURL();
            } catch (MalformedURLException e) {
                throw new IllegalStateException("Unable to load plugin: "
                        + pluginLibraries[i], e);
            }
        }

        URLClassLoader pluginsClassLoader = new URLClassLoader(pluginLibUrls,
                ServiceInterface.class.getClassLoader());

        ServiceLoader<ServiceInterface> serviceLoader = ServiceLoader.load(
                ServiceInterface.class, pluginsClassLoader);

        return serviceLoader;
    }

    private File[] getPluginLibraries() {
        // please implement
    }
}

对于简单的扩展机制,请查看


要获得更完整的扩展机制,请查看OSGi。

要获得简单的扩展机制,请查看


要了解更完整的扩展机制,请看一下OSGi。

有:自定义类加载器、OSGi等。解决方案很多。有:自定义类加载器、OSGi等。解决方案很多。你知道我可能看的任何示例吗?你知道我可能看的任何示例吗?谢谢!最后一个问题,如果我想把jar文件放到别的地方怎么办?因为不是在它运行的类路径中。谢谢!最后一个问题,如果我想把jar文件放到别的地方怎么办?而不是在它运行的类路径中。