从不同文件夹加载 Jar 文件

2024-01-09

我目前正在制作 Minecraft Mod Loader。

package spideyzac;

import java.util.concurrent.CopyOnWriteArrayList;

import org.lwjgl.opengl.Display;

import spideyzac.Module;

public class Client {
    
    public static String name = "Pizza Mod Loader", version = "1";
    public static CopyOnWriteArrayList<Module> modules = new CopyOnWriteArrayList<Module>();
    
    public static void startup() {
        Display.setTitle(name + " v" + version);
    }
    
    public static void onKey(int key) {
        for (Module m : modules) {
            if (m.keyCode == key) {
                m.toggle();
            }
        }
    }
    
    public static void update() {
        for (Module m : modules) {
            if (m.isEnabled()) {
                m.ifEnabled();
            } else {
                m.ifNotEnabled();
            }
        }
    }
    
}

正如你在上面看到的,我有一个名为 Client 的类。当 Minecraft 游戏启动时调用 Startup。现在我有一个名为 Mods 的文件夹,当调用启动时,我需要将 mods 文件夹中的 mod 加载到 ArrayList 命名的模块中。更深入地说,每个 Mod 将有一个继承此 Module 类的 Main 类

package spideyzac;

import org.lwjgl.input.Keyboard;

import net.minecraft.client.Minecraft;

public class Module {

    public static int keyCode;
    public static String name;
    public static boolean enabled;
    public Minecraft mc = Minecraft.getMinecraft();
    
    Module (int keyCode, String name) {
        this.keyCode = keyCode;
        this.name = name;
    }
    
    public void onEnable() {
        
    }
    
    public void onDisable() {
        
    }
    
    public void toggle() {
        enabled = !enabled;
        if (enabled) {
            onEnable();
        } else {
            onDisable();
        }
    }
    
    public void ifEnabled() {
        
    }
    
    public void ifNotEnabled() {
        
    }
    
    
    public static boolean isEnabled() {
        return enabled;
    }
    
    public static int getKeyCode() {
        return keyCode;
    }
    
    public static boolean checkKey(int key) {
        return Keyboard.isKeyDown(key);
    }
    
}

因此,当调用启动时,我需要遍历 mods 文件夹中的每个 Mod,并将模块的 Main 类的新实例添加到 ArrayList 模块中。


有一个名为 URLClassLoader 的类用于此目的。

顾名思义,它可以从 URL 加载类:

File[] files=new File("Mods").listFiles();
URL[] urls=new URL[files.length];
for(int i=0;i<files.length;i++){
    urls[i]=files[i].toURI().toURL();
}
URLClassLoader modLoader=new URLClassLoader(urls);

一行:

URLClassLoader modLoader=new URLClassLoader(Stream.of(new File("Mods").list()).map(file->file.toURI().toURL()).toArray(URL[]::new));

您还可以为每个 JAR 创建一个类加载器。

File[] files=new File("Mods").listFiles();
for(int i=0;i<files.length;i++){
    URL url=files[i].toURI().toURL();
    URLClassLoader modLoader=new URLClassLoader(url);
}

如果您知道包名称,则可以加载类:

Class<?> cl=modLoader.loadClass("fully.qualified.name");
Object o=cl.getDeclaredConstructor().newInstance();
if(o instanceof Module){
    modules.add((Module)o);
}

如果您不知道类名,可以使用名为 Reflections 的库来获取Class对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从不同文件夹加载 Jar 文件 的相关文章

  • Java GuardedString - 用于加密的随机密钥是否存储在 Java 堆内存中?如果不是,那么密钥保存在哪里?

    Oracle 的 org identityconnectors common security GuardedString 要转换为 GuardedString 的原始数据需要由 EncryptorImpl class 随机生成的加密密钥
  • 谁能解释一下 servlet 映射吗?

    我正在尝试使用 SpringMVC 编写一个 Web 应用程序 通常我只是将一些虚构的文件扩展名映射到 Spring 的前端控制器并快乐地生活 但这次我要使用类似 REST 的 URL 没有文件扩展名 将我的上下文路径下的所有内容映射到前端
  • eclipse juno 打开时出错

    在安装 Eclipse 并正常工作一年多后 我今天打开 Eclipse Juno 并在打开工作区时收到一条错误消息 我使用的是 Windows 8 64 位 Java 64 位和 Eclipse 64 位 此后我尝试重新安装 Java 和
  • Selenium webdriver :列表不是通用的;它不能使用参数 `` 类型进行参数化

    我试图将链接存储在列表中 请按照以下代码操作 public class frameswitch public static void main String args System setProperty webdriver gecko d
  • 匿名内部类显示不正确的修饰符

    据我了解 以下代码应该打印true作为输出 但是 当我运行这段代码时 它正在打印false 来自 Java 文档15 9 5 匿名类 https docs oracle com javase specs jls se8 html jls 1
  • java.lang.NoClassDefFoundError:HttpSessionListener

    我正在尝试部署一场我没有编写的战争 但我在日志中收到此错误 java lang NoClassDefFoundError HttpSessionListener 我知道 HttpSessionListener 位于servlet api j
  • 使用 Gson 序列化时如何公开类名

    我的场景非常复杂 但总结如下 我试图了解编译器的源代码 并了解每个 AST 节点代表什么 我正在生成不同程序的 AST 的 JSON 序列化 然后检查可视化的 JSON 输出 它工作得很好 除了一个问题是在 Gson 中生成的 JSON 数
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • 黄瓜与 Micronaut

    我正在尝试将 Cucumber 与 Micronaut 一起使用 但当我尝试将其与 Cucumber 一起使用时 MicronautTest 注释根本不起作用 未注入 theApple 请参阅下面的代码 如果我在没有黄瓜的情况下运行它就可以
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • Java 中的本机方法

    我花了一些时间学习什么是 Java Native 方法以及它们是在平台相关代码 主要是 C 中实现的 但是我在哪里可以找到这些 Java 的本机实现呢 例如 Thread 类的 sleep long millis 方法是本机的 但它的实现代
  • 在 JSON 对象中强制执行非空字段

    我们的 REST API 接收一些 JSON 对象输入 其中某些字段要求不为空 这些可以是字符串 整数 甚至可以是其他一些类实例作为参考 我们正在尝试找到一种方法来强制这些字段不为空 而不是在 API 中进行空检查的正确方法 当前的 if
  • Spring @Value 添加验证小于

    我使用以下属性值注入 我如何向此操作添加小于验证 我的意思是我想设置一个验证user maxpassiveday可以说 财产价值不得低于 100 Value user maxpassiveday int maxpassiveday 使用Sp
  • 如何在 Spring Boot 中创建 Apache POI Excel 视图配置

    当我想使用 Spring Boot Web 将数据导出到 Excel 时遇到问题 我使用 Thymeleaf 作为模板引擎 由 Spring Boot 自动配置 但是当我在附加配置中添加 XmlViewResolver 时 由 XmlVie
  • JSP 作为电子邮件模板

    有没有办法发送 MIME 电子邮件 其中电子邮件正文源自 JSP 我需要使用 Javamail 发送一封电子邮件 其中包含一个表格 我认为如果我可以使用 JSP 来完成所有格式设置和布局 将会很方便 在这个线程中 Java 电子邮件模板的建
  • 获取证书链

    我正在 Java 中使用 X509 证书 给定一个证书 是否可以在签名层次结构中找到所有其他证书 直到找到根证书 我有一个证书文件 带有 cer扩展名 我想提取父签名证书 我想继续查找该证书的父证书 直到获得最终的自签名根证书 我已经检查了
  • 为什么jdk中没有ConcurrentLinkedHashMap类?

    这个问题直接接着问从我之前的问题来看 https stackoverflow com q 12299731 1527084 我想我的第二个问题的答案是否定的 所以我想了解为什么 java util concurrent 包中没有 Concu
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • 如何将多部分文件从另一个服务发送到一个服务

    我有两个端点 api 它们是 uploadand 重定向 upload是我直接上传文件的地方 重定向是我接收文件并将其传递给上传并获取 JSON 响应的地方 upload 所以下面是我的代码 package com example impo
  • 如何正确使用Google Calendar API Events.Insert命令?

    所以我一直使用REST方法来调用Google的API 我需要将事件插入到我拥有 ID 的特定日历中 这是我发送的 POST 请求 地址 https www googleapis com calendar v3 calendars https

随机推荐

  • 如何在 AngularJS 指令中的元素上绑定滚动事件

    如何在 AngularJS 指令中的元素上绑定滚动事件 我在 window 上绑定滚动 但现在我需要将其更改为此类 body wrapper angular element document queryselector body wrapp
  • 如何将 pandas 数据框逐行写入 CSV 文件,一次一行?

    我有一个大约 100 万个地址的列表 以及一个查找它们的纬度和经度的函数 由于某些记录的格式不正确 或出于任何原因 有时该函数无法返回某些地址的纬度和经度 这将导致 for 循环中断 因此 对于成功检索到纬度和经度的每个地址 我想将其写入输
  • firebase db:具有 Kotlin 委托属性的模型

    我正在使用 Kotlin 对象来处理我的 Firebase 数据库模型 如上所述在指南中 https firebase google com docs database android read and write basic write
  • 使用 JavaScript 滚动页面

    我在用着Ender js http ender no de 我试图让页面滚动到特定位置 我认为我在这里做错了什么 但页面甚至没有移动 理想情况下 我希望使用动画事件 但 emile 不接受scrollTop 作为参数 任何帮助表示赞赏 do
  • UICollectionView indexPathsForVisibleItems 不更新新的可见单元格

    我有一个 ViewController 里面有一个 CollectionView 加载视图时 可见单元格 9 个单元格 会正确显示 当我向下滚动时 我想通过调用partnerCollectionView的indexPathsForVisib
  • 使用 DecelerationEnded 会干扰其他回调

    我正在尝试使用减速结束与 一起回调Tapped MT Dialog 元素上的回调 我无法让两者同时工作 当 DecelerationEnded 回调被注释掉时 点击 回调将起作用 当它被注释时 tapped 回调将不再被触发 而 Decel
  • 如何在spark中设置驱动程序的python版本?

    我正在使用 Spark 1 4 0 rc2 因此我可以将 python 3 与 Spark 一起使用 如果我添加export PYSPARK PYTHON python3 to my bashrc文件中 我可以与 python 3 交互运行
  • 清除 Laravel 的 orderBy

    我有一个通用函数 它为我提供通用查询集 例如 class Model extends Eloquent public static function get queryset queryset self where foo bar Do t
  • wxPython:wx.PyControl可以包含wx.Sizer吗?

    Can a wx PyControl包含一个wx Sizer 请注意 我最终想要在这里做的事情 具有浮点值的旋转器 已经在另一个问题中得到了回答 我对在 a 中布局小部件特别感兴趣wx PyControl如果我需要制作自己的自定义小部件 这
  • 上传文件时发生 Curl 错误“创建表单数据失败”

    当我尝试使用 php 和curl 上传文件时 出现错误 创建表单数据失败 我知道当文件路径不正确时会发生错误 test php postcontent files test jpg test php 和 test jpg 在同一文件夹中 但
  • 解析用户对象ACL

    我是解析新手 对解析用户 表 中数据的安全性有疑问 我想将附加数据与用户数据一起存储 例如 电话号码 但默认情况下 解析将用户表设置为任何人都具有读取权限 因此 如果有人点击我的解析 api 他们将能够获得所有用户及其电话号码的列表 显然这
  • 将基本 Cocoa 应用程序转换为基于文档的应用程序

    我和我的团队一直在开发一个现有的 非基于文档的 Cocoa 应用程序 这是我们的第一个 Cocoa 应用程序 尽管到目前为止我们已经开发了许多 iOS 应用程序 不过 该应用程序确实应该是基于文档的 因此我已经开始尝试对其进行转换 但这里和
  • Sphinx:同一图形可能有不同的相对路径吗?

    我是狮身人面像新手 想在两个不同的版本中显示相同的图形 rst files 第一个 rst 文件 lower rst 与 figures 文件夹位于同一级别 我在其中包含一个图形 如下所示 figure figures figure1 pn
  • 模数除法如何工作

    我不太明白模数除法是如何工作的 我在计算27 16并结束了11我不明白为什么 我似乎无法在网上找到通俗易懂的解释 有人可以详细说明这里发生了什么吗 大多数解释都遗漏了一个重要步骤 让我们用另一个例子来填补空白 鉴于以下情况 Dividend
  • 启动进程的服务不会显示 GUI C#

    嘿 我正在尝试获取服务来启动我的程序 但它没有显示 GUI 该过程开始 但没有显示任何内容 我尝试启用 允许服务与桌面交互 但仍然不起作用 我的程序是一个计算机锁定设备 用于阻止未经授权的用户访问计算机 我正在运行带有 64 位操作系统的
  • 在 Mac 应用程序中执行 AppleScript 文件?

    我正在寻找一种从 Mac 应用程序中执行 Applescript 文件的方法 我以前制作过使用的 mac 应用程序NSAppleScript script NSAppleScript alloc initWithSource MY CODE
  • 识别某人正在玩的游戏而无需聊天(discord bot python)

    不和谐机器人蟒蛇 代码是 如果有人聊天 如果这个人正在玩 守望先锋 他或她将被提升为玩家角色 如果没有 他或她将被删除或什么也不会发生 但我正在寻找一种无需聊天即可识别正在玩的游戏的方法 有人能帮我吗 client event async
  • 在 PHP 中组合图像同时保留透明度

    看看这里 我想删除蓝色部分末端的白色东西 但我尝试了很多不同的方法 但都不起作用 如果需要 可以在以下位置找到 pnghttp tyilo jbusers com PNG http tyilo jbusers com PNG 文件夹 htt
  • Owl Carousel 2 - 如何获取当前物品?

    我正在使用 Owl Carousel 2 开发一个网站 我只想检测哪个项目显示在前面 以前是这样的 http owlgraphic com owlcarousel demos owlStatus html http owlgraphic c
  • 从不同文件夹加载 Jar 文件

    我目前正在制作 Minecraft Mod Loader package spideyzac import java util concurrent CopyOnWriteArrayList import org lwjgl opengl