2013-11-02 33 views
1

我可以从插件像onEnable()运行一个方法,我的脚本不工作。 :(从jar文件运行的方法,他们已经扩展了一个类

扩展的类:

package de.R3N3PDE.X.API; 
import de.R3N3PDE; 

public class JavaPlugin{ 
    Server server; 
    public ServerManager getServer(){ 
     return new ServerManager(server); 
    } 

    public ServerManager setServer(Server s){ 
     server = s; 
    } 

    public PluginLogger getLogger(){ 
     return new PluginLogger(server); 
    } 
} 

插件:

package de.R3N3PDE.PluginExample; 
import de.R3N3PDE.X.API.JavaPlugin; 

public class PluginExample extends JavaPlugin{ 
    public void onEnable(){ 
     getLogger().info("Plugin Enabled!"); 
    } 
} 

插件加载:

package de.R3N3PDE.X.Plugin; 
imports de.R3N3PDE.X.API.JavaPlugin; 

public void initPlugins(){ 
    try { 
     File loc = new File("plugins"); 
     extendClasspath(loc); 

     ServiceLoader<JavaPlugin> sl = ServiceLoader.load(JavaPlugin.class); 
     Iterator<JavaPlugin> apit = sl.iterator(); 
     while (apit.hasNext()){; 
      JavaPlugin met = apit.next(); 
      //Set the Server 
      med.setServer(s); 
      //run void onEnable(); in the Plugin???? 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

============= =======

编辑: 谢谢。我有一个新的问题... URLClassLoader找到插件,但ServiceLoader不能加载插件。 我认为ServiceLoader不能提供扩展类。

插件:

package de.R3N3PDE.PluginExampleName; 
import de.CodingDev.X.Server.API.JavaPlugin; 

public class PluginExampleName extends JavaPlugin{ 
    @Override 
    public void onEnable() { 
     System.out.println("Test"); 
     getLogger().info("Plugin Enabled!"); 
    } 
} 

我必须做出新的插件加载旧版本这么想的工作:

public void onLoad(){ 
    File loc = new File("plugins"); 

    File[] flist = loc.listFiles(new FileFilter() { 
     public boolean accept(File file) {return file.getPath().toLowerCase().endsWith(".jar");} 
    }); 
    URL[] urls = new URL[flist.length]; 
    for (int i = 0; i < flist.length; i++) 
     urls[i] = flist[i].toURI().toURL(); 
    URLClassLoader ucl = new URLClassLoader(urls); 
    for(URL url : ucl.getURLs()){ 
     s.getLogger().info("PluginLoader", "Found Plugin: " + url.getFile()); 
    } 
    ServiceLoader<JavaPlugin> sl = ServiceLoader.load(JavaPlugin.class, ucl); 

    Iterator<JavaPlugin> apit = sl.iterator(); 
    while (apit.hasNext()){ 
     s.getLogger().info("PluginLoader", "Loading Plugin"); 
     apit.next().onEnable(); 
    } 
} 

日志:

[日志] [二○一三年二月十一日15:26:09] [PluginLoader] [INFO]加载插件...

[日志] [02.11.2013 15:26:09] [PluginLoader] [INFO]发现插件:/C:/Users/René/Desktop/Server/plugins/CommandLogger.jar

+0

是'met'一样'med'?这是一个错字还是我错过了什么? – nio

+0

是的,遇到了和med一样的东西,这是一个错字 – GhostZero

回答

0

如何使您的类抽象为onEnable方法?

public abstract class JavaPlugin{ 
    Server server; 
    public ServerManager getServer(){ 
     return new ServerManager(server); 
    } 

    public ServerManager setServer(Server s){ 
     server = s; 
    } 

    public PluginLogger getLogger(){ 
     return new PluginLogger(server); 
    } 

    public abstract void onEnable(); 
} 

然后你必须在你的子类中实现onEnable方法。 然后,您可以调用扩展JavaPlugin的任何动态生成的子类的onEnable方法。

第二种方式可能是在Javaplugin中实现onEnable方法,然后在扩展类中重写该方法。

public class JavaPlugin { 
    ... 
    public void onEnable(){ 
     getLogger().info("JavaPlugin onEnable default implementation!"); 
    } 
} 

在你PluginExample文件:

public class PluginExample extends JavaPlugin{ 
    @Override 
    public void onEnable(){ 
     getLogger().info("Plugin Enabled!"); 
    } 
} 
+0

“PluginExample”是一个Example类,这个类名是动态的 – GhostZero

+0

查看新建议 – nio

+0

查看我的问题top: ======= ============= 编辑: – GhostZero

相关问题