我正在尝试找到一种方法来为当前操作系统动态加载与平台相关的库jar。我需要访问使用JNI调用的第三方库,并且具有适用于Mac和Windows的不同jar。两个库的所有调用和返回都是相同的,并且在编译工作之后简单地交换lib目录中的jar文件,但我希望我的应用程序能够确定应该在运行时加载哪个jar。
我在这里发现了类似的帖子,但没有直接解决这个问题。 this post显示了如何通过ClassLoader动态加载jar,但是从我收集的内容来看,这意味着我必须使用Method method = clazz.getDeclaredMethod("methodName")
,method.invoke()
方法来调用该类提供的任何方法,如以及显式调出每个要加载到类加载器的类(我非常希望避免)。
我希望找到类似的解决方案:
import external.lib.namespace.LibClassA;
import external.lib.namespace.LibClassB;
public class MyClass {
static {
if (System.getProperty("os.name").contains("Windows") {
ClassLoader.getSystemClassLoader().load("Lib_win.jar");
} else {
ClassLoader.getSystemClassLoader().load("Lib_mac.jar");
}
}
public static void Main(String[] args) {
LibClassA.platformDependantCall();
LibClassB.someOtherCall();
}
}
答案 0 :(得分:0)
您引用的帖子有关于JCL ClassLoader框架的答案 - 请参阅https://stackoverflow.com/a/1450837/982341
如果查看该框架的文档,您将看到它支持创建已加载类的实例,并提供将它们转换为正确对象的方法,这样您就不必使用反射。
答案 1 :(得分:0)
System.getProperty("os.name")
不能用于每次获取有关操作系统的信息。如果用户调用JVM没有所需的安全权限,它将失败并发生SecurityException异常。