以后如何使用另一个.jar或.java扩展我的jar

以后如何使用另一个.jar或.java扩展我的jar,java,Java,我想象我的应用程序是这样的: 我有一个加密文件的应用程序。稍后我想用另一个密码扩展我的应用程序(jar)中的密码。 因此,我将有一个带有密码的文件夹(jar或java文件),我的应用程序将从这个文件夹中读取文件。然后,在GUI中,将有一个包含文件(jar或java)的列表,其中包含一个加密和解密方法(我将使用反射测试)。用户将选择一个 有人能给我一个建议吗?如何使它,它可以扩展?或者我的应用程序(.jar)如何与另一个.jar、.java文件一起工作(读取并运行它们)?我会查看 本文件描述了该机

我想象我的应用程序是这样的: 我有一个加密文件的应用程序。稍后我想用另一个密码扩展我的应用程序(jar)中的密码。 因此,我将有一个带有密码的文件夹(jar或java文件),我的应用程序将从这个文件夹中读取文件。然后,在GUI中,将有一个包含文件(jar或java)的列表,其中包含一个加密和解密方法(我将使用反射测试)。用户将选择一个

有人能给我一个建议吗?如何使它,它可以扩展?或者我的应用程序(.jar)如何与另一个.jar、.java文件一起工作(读取并运行它们)?

我会查看

本文件描述了该机制 由Java提供™ 平台 处理可选包。一 可选包是一组 封装在一个或多个罐子中的包 实现API的文件 扩展Java平台。可选的 包类在中扩展了平台 虚拟机可以 找到并加载它们,而不需要它们 在类路径上,就像它们 类是平台的核心吗 API


另一种方法是机制。(请阅读文档。)

您的附加jar将包含一个文件
META-INF/services/my.package.Cipher
,列出您的密码接口(或抽象类)的所有实现,然后您可以说

ClassLoader cipherLoader =
    new URLClassLoader(new URL[]{new URL("jar:file:myAdditional.jar")},
                       Cipher.class.getClassLoader());
ServiceLoader<Cipher> serviceLoader = ServiceLoader.load(Cipher.class, cipherLoader);
for(Cipher c : serviceLoader) {
    c.encrypt(...);
}
ClassLoader密码加载器=
新的URLClassLoader(新的URL[]{newURL(“jar:file:myAdditional.jar”)},
Cipher.class.getClassLoader());
ServiceLoader ServiceLoader=ServiceLoader.load(Cipher.class,cipherLoader);
for(密码c:serviceLoader){
c、 加密(…);
}
使用
ServiceLoader
强制要求您的实现具有公共无参数构造函数-如果它们没有,则对某些工厂接口使用
ServiceLoader


URL应该是指向类所在的jar文件的
jar:
URL,或者指向
.class
文件所在的根目录(在其包结构中)的非jar URL。

我不明白,这意味着什么:新URL[]{newURL(“file:myAdditional.jar”)}文件:myAdditional.jar这是文件夹的路径还是文件夹所在的方向?或者什么?它是附加类所在的jar文件的URL。您还可以指示编译类所在的目录(文件夹),而不是jar文件。