繁体   English   中英

从不同的文件夹加载 Jar 文件

[英]Loading Jar File From Different Folder

我目前正在制作 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 的 class。 Startup 在 Minecraft 游戏启动时被调用。 现在我有一个名为 Mods 的文件夹,当调用启动时,我需要将 mods 从 mods 文件夹加载到名为 ArrayList 的模块中。 更深入地说,每个 Mod 都有一个 Main class,它继承了这个 Module class

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);
    }
    
}

所以当启动被调用时,我需要go通过mods文件夹中的每个Mod并将模块的Main class的新实例添加到ArrayList模块。

为此有一个名为 URLClassLoader 的 class。

顾名思义,它可以从 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 创建一个 ClassLoader。

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);
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM