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