我的Minecraft mod插件不能使用Minecraft伪造源中的任何类

问题描述 投票:0回答:1

这是成功加载插件的代码(我知道这是因为我在插件中使用了记录器,并且在日志文件中看到了消息)。唯一的问题是,如果插件中的事件处理方法包含来自Minecraft forge来源的内容,它将不会调用该方法。

public void loadPlugin(File jar)
{
    try
    {
        ClassLoader jarClassLoader=URLClassLoader.newInstance(new URL[]{jar.toURI().toURL()},getClass().getClassLoader());
        Enumeration<JarEntry> jarEntries=new JarFile(jar).entries();
        while(jarEntries.hasMoreElements())
        {
            JarEntry jarEntry=jarEntries.nextElement();
            if(jarEntry.isDirectory()|!jarEntry.getName().endsWith(".class"))
                continue;
            Class aClass=jarClassLoader.loadClass(jarEntry.getName().substring(0,jarEntry.getName().length()-6).replace('/','.'));
            if(aClass.isAnnotationPresent(PatchPlugin.class))
            {
                plugins.add(aClass);
                EventHandler.passEvent(aClass,new LoadEvent());
            }
        }
    }
    catch(IOException|ClassNotFoundException ignored){}
}

并且此代码将事件传递给插件

public static boolean passEvent(Class plugin,Event event)
{
    for(Method method:plugin.getDeclaredMethods())
    {
        if(method.isAnnotationPresent(EventTarget.class))
        {
            try
            {
                Class[] parTypes=method.getParameterTypes();
                if(parTypes.length==1&parTypes[0].isInstance(event))
                {
                    method.invoke(plugin.newInstance(),event);
                    return event.isCancelled();
                }
            }
            catch(IllegalAccessException|InvocationTargetException|InstantiationException ignored){}
        }
    }
    return false;
}
java reflection classloader minecraft-forge
1个回答
0
投票

不从文件加载类。

未加载依赖项类时,类加载会导致ClassNotFoundException

只需添加到类路径,并使用它们。

请参见this帖子以添加类路径。

© www.soinside.com 2019 - 2024. All rights reserved.