gpt4 book ai didi

java - 如何从运行时加载的类中调用构造函数? java

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:37 25 4
gpt4 key购买 nike

我有一个类加载器,它从/plugins 文件夹中的所有 jar 文件加载“主”类这假定所有 jar 包都有 plugin.(plugin name) 包含名为 main 的类。每个主类都有一个名为 main 的构造函数。

类加载成功,但我需要知道如何从加载的类中调用主构造函数。

(这个类/类在运行时加载)

我试过用这个:

Constructor c = cls.getConstructor(Integer.class); //line 41

Plugin plug = (Plugin) c.newInstance(0);

但是我得到这个错误:

java.lang.NoSuchMethodException: plugin.myplugin.main.<init>(java.lang.Integer)  
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getConstructor(Unknown Source)
at hkr.classloader.PluginLoader.loadPlugins(PluginLoader.java:41)
at hkr.core.startup.InitializeGame.inigame(InitializeGame.java:32)
at hkr.launcher.main.LauncherMain.main(LauncherMain.java:16)

package hackers.classloader;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import org.java.plugin.Plugin;

public class PluginLoader
{
@SuppressWarnings({ "unused", "rawtypes", "resource" })
public static void loadPlugins() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
Class cls = null;
int x = hackers.core.startup.InitializeGame.map.size();
for (int i = 1; i<=x;i++)
{
String className = hackers.core.startup.InitializeGame.map.get(i + "");

File file = new File(System.getProperty("user.dir") + File.separator + "plugins" + File.separator + className + ".jar");
URL url = null;
try {
url = file.toURI().toURL();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);

try {
cls = cl.loadClass("plugin." + className + ".main");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Constructor c = cls.getConstructor(Integer.TYPE);
Plugin plug = (Plugin) c.newInstance(0);
}
}
}

最佳答案

如果您的构造函数采用 java.lang.Integer,据我所知,您的代码应该可以工作。

但如果构造函数的唯一参数是 int,则 getConstructor 将失败。在这种情况下,您必须使用 Integer.TYPE 而不是 Integer.class。我我是对的,你需要做的是:

Constructor c = cls.getConstructor(Integer.TYPE);

编辑:根据您的编辑和评论,存在几个问题。

  1. 您要加载的类似乎没有任何显式构造函数,这意味着您只需执行 cls.getConstructor()
  2. 您要执行的 (public static void main) 是一个静态方法,您通常不需要类的实例。另外,由于用户@Eric B 解释的原因,我不确定“main”是否是一个好名字。
  3. 既然你想调用一个方法,你必须实例化构造函数并调用该方法。

根据我的理解,您要执行的代码应该是这样的:

Constructor c = cls.getConstructor(); // we get the implicit constructor without parameters
Plugin plugin = (Plugin) c.newInstance(); // we instantiate it, no parameters

Method m = cls.getDeclaredMethod("main", Integer.TYPE);
m.invoke(plugin, 0); // we invoke the method "main" on our dynamically loaded class, with the 0 parameter.

关于java - 如何从运行时加载的类中调用构造函数? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com