java - 如何动态加载目录中的所有jar?

标签 java eclipse-plugin osgi urlclassloader

嗨,我正在创建一个插件,它需要动态加载 jar 并访问这些 jar 的类和方法。我尝试使用 URLClassLoader 并且能够加载类,如下所示

URL myJarFile = new URL("jar","","file:"+jarPath);
URLClassLoader sysLoader =(URLClassLoader)ClassLoader.getSystemClassLoader();
Class sysClass = URLClassLoader.class;
Method sysMethod = sysClass.getDeclaredMethod("addURL", new Class[]{URL.class});
sysMethod.setAccessible(true);
sysMethod.invoke(sysLoader, new Object[]{myJarFile});

但问题是我们必须通过单独指定类的名称来将类加载到 classLoader 中。 我想要的是从类路径中的所有 jar 中加载所有类并在任何时间点访问它们。

可以使用 URLClassLoader 吗?如果不是,还有什么其他选择? OSGI 对实现这一目标有多大帮助?

提前致谢!

最佳答案

您需要先加载 jar,然后从那里加载所需的类。

URL myJarFile = new URL("jar","","file:"+jarPath);
URLClassLoader child = new URLClassLoader (myJarFile , this.getClass().getClassLoader());
Class classToLoad = Class.forName ("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod ("myMethod");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);

然后可以先获取jar文件中所有类的列表:

List<String> classNames=new ArrayList<String>();
ZipInputStream zip=new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for(ZipEntry entry=zip.getNextEntry();entry!=null;entry=zip.getNextEntry())
    if(entry.getName().endsWith(".class") && !entry.isDirectory()) {
        StringBuilder className=new StringBuilder();
        for(String part : entry.getName().split("/")) {
            if(className.length() != 0)
                className.append(".");
            className.append(part);
            if(part.endsWith(".class"))
                className.setLength(className.length()-".class".length());
        }
        classNames.add(className.toString());
    }

获得类(class)列表后,请执行以下操作:

File file = new File("Absolute Path to your jar");  
            URL url = file.toURI().toURL();  
            URL[] urls = {url};  
            ClassLoader loader = new URLClassLoader(urls);  
            Class myClass = loader.loadClass(classNames.get(0));  
            System.out.println("Executing...");  
            Object tester = myClass.newInstance(); 
        System.out.println("Test");

关于java - 如何动态加载目录中的所有jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904219/

相关文章:

html - Netbeans 有 "Print to HTML"- 有没有办法将此功能添加到 Eclipse?

java - 是否可以在不同(插件)运行之间保存工作空间?

java - OSGi 类似于其他编程语言中的模块化

jakarta-ee - 在 glassfish 上发射 felix shell

osgi - org.osgi.framework.storage.clean=onFirstInit 在 Apache Felix OSGi 实现的上下文中是什么意思?

Java DOM XML 解析如何遍历多个节点级别

java - 我可以将此 Mysql 查询转换为 JPA 吗?

java - 使用 JPA 和 Hibernate 创建表(连接表)

java - 将 gmf 与 xpand oaw 集成

java - 针对 remove(int index) 优化的 List 实现