我正在尝试找到一种方法来为当前操作系统动态加载依赖于平台的库jar。我需要访问第三方库,该库使用JNI调用,并且在Mac和Windows上具有不同的jars。这两个库的所有调用和返回都是相同的,并且只需在编译后交换lib目录中的jar文件即可工作,但我希望我的应用程序能够确定应该在运行时加载哪个jar文件。
我在这里找到了类似的帖子,但没有直接解决这个问题的帖子。this post展示了如何通过ClassLoader动态加载jars,但从我收集的信息来看,这意味着我必须使用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();
}
}发布于 2012-03-08 09:28:41
您提到的帖子中有一个关于JCL ClassLoader框架的答案--请参阅https://stackoverflow.com/a/1450837/982341
如果您查看该框架的文档,您会发现它支持创建已加载类的实例,并提供了将它们转换为适当对象的方法,因此您不必使用反射。
发布于 2013-08-08 19:28:59
System.getProperty("os.name") 不能每次都用于获取有关操作系统的信息。如果调用JVM的用户没有所需的安全权限,则会失败,并引发SecurityException异常。
https://stackoverflow.com/questions/9609332
复制相似问题