当前位置: 首页 > 知识库问答 >
问题:

使用NIO浏览JAR类

壤驷深
2023-03-14

我有一个包含一些JAR的插件文件夹,我想加载他们所有的*。类。我看到很多答案都有JarFileZipEntry的东西。然而,我想使用java.nio包而不是io来做到这一点。

我能做的是:

  1. 使用文件列出文件夹中的文件(例如列出我所有的JAR)。列表(路径)
  2. 正在加载一个。类,知道它在所述罐子中的确切位置

我还不能做的事:

  1. 使用NIO在JAR/ZIP中列出文件

最终,我想要:

  1. 在几个JAR中遍历每个类并加载它们以寻求一种插件系统的注释

我应该补充一点,我不需要使用像Guava或Apache这样的API的工作解决方案,但我只想知道它是如何完成的。

我当前的代码:

import java.io.IOException;
import java.nio.file.*;
import java.security.SecureClassLoader;
import java.util.*;
public class PluginManager {

public final Path pluginFolder;

public PluginManager(Path pluginFolder) {
    this.pluginFolder = pluginFolder;
}


public void load() {
    final var pluginClassLoader = new SecureClassLoader(getClass().getClassLoader()){

        FileSystem jar;

        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            String pluginClassName = jar.getSeparator() + name.replaceAll("\\.", jar.getSeparator()) + ".class";
            try{
                byte[] bytes = Files.readAllBytes(jar.getPath(pluginClassName));
                return defineClass(name, bytes, 0, bytes.length);
            }catch(IOException e){
                e.printStackTrace();
            }
            throw new ClassNotFoundException("Failed to found "+name);
        }
    };

    try(Stream<Path> files = Files.list(pluginFolder)){
        files.filter((file) -> !Files.isDirectory(file) &&
                (file.toString().endsWith(".jar") || file.toString().endsWith(".zip")))
                .forEach(jar -> {

                    try(FileSystem fileSystem = FileSystems.newFileSystem(jar)){
                        pluginClassLoader.jar = fileSystem;
                        loadPlugin(fileSystem, pluginClassLoader);
                    }catch(IOException | ClassNotFoundException e){
                        e.printStackTrace();
                    }

                });
    }catch(IOException e){
        e.printStackTrace();
        throw new IllegalStateException("Failed to scan plugin folder. Cannot continue.");
    }

}

private void loadPlugin(FileSystem jar, SecureClassLoader classLoader) throws IOException, ClassNotFoundException{
    String className = ...  // here, we retrieve the plugin class name from a manifest file using FileSystem.getPath().
// what I want is to get rid of that manifest and to load and test every class.

    Class<?> clazz = classLoader.loadClass(className);
    // do stuff with loaded class
}

我想避免使用java。io代码如下:如何在运行时从文件夹或JAR加载类?

共有1个答案

古文康
2023-03-14

我在一个zip文件夹及其子文件夹中偶然发现了这个文件列表。这种方法最初让我错过的是不调用文件。walkFileTree(Path,FileVisitor)使用文件夹中的jar路径,而是使用创建的文件系统的根路径(使用FileSystem.getPath(“/”)。这对我来说非常有效。

 类似资料:
  • 我有一个插件文件夹,其中包含一些JAR,我想加载它们的所有*。班我看到很多关于或的答案。然而,我想用java来实现这一点。nio包而不是io。 我能做的是: 使用 我还不能做的事: 使用NIO在JAR/ZIP中列出文件 最终,我想要: 在几个JAR中遍历每个类,并加载它们以寻找一种插件系统的注释 我应该补充一点,我不需要一个使用像番石榴或阿帕奇这样的应用编程接口的工作解决方案,但我只想知道它是如何

  • 我想运行和控制一个浏览器窗口从一个web应用程序,以自动化的一些事情(如帐户创建等)在另一个网站。 所以我的问题是,有没有一种方法可以直接从浏览器使用selenium来实现它,在这种情况下如何实现它? 我知道有selenium-webdriver for JS,但在常见的用例中,我们将它与Node.JS一起使用。 WebDriver介绍建议这是可能的: 它的主要目的是允许web作者编写测试,使用户

  • 我有三维PDF文件。它包含许多三维图形,但它嵌入在一个页面中。我们正在导航到导航窗格(模型树)中的图形- 我想使用带有iTextSharp的C#浏览这个3d pdf。 请让我知道如何实现它? 例如: http://examples.itextpdf.com/results/part4/chapter16/pdf3d.pdf 上面的pdf有模型树。它有模型、选项和信息面板。现在我想控制模型选择。

  • Less 可以直接在浏览器端运行(支持IE6+、Webkit、Firefox),也可以借助Node.js或者Rhino在服务端运行。 Less是一种动态语言,无论是在浏览器端,还是在服务器端运行,最终还是需要编译成 CSS,才会发挥其作用。 浏览器端使用 在浏览器端直接使用Less,浏览器会直接为页面应用编译后的CSS样式,而不是生成单独的CSS文件。 在浏览器端直接使用Less,需要一个脚本的支

  • 喂, 我使用一个webview,上面有一个按钮,可以浏览应用程序的照片库。 但是,当在webview中单击该按钮时,什么也不会发生。 url的格式为: 我已添加以下权限: 我有一个片段,它将在启用javascript的onCreateView方法(仅限代码段)中加载webview。

  • 表 24.2.    向前 向后 整页 Ctrl+f Ctrl+b 半页 Ctrl+d Ctrl+u 文件 G gg 按行号转到相应行 行号 G 按百分比转到相应的行 1~100% 按行卷动 Ctrl+e Ctrl+y 将光标所在行调整至页面中间 zz 统计字数 g Ctrl+g 显示位置信息 Ctrl+g 刷新屏幕 Ctrl+l 提示 gg 定位到文件首行, V 进入可视行模式, G 定位到文件