Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从另一个类运行方法,但该类是字符串_Java_Minecraft_Bukkit - Fatal编程技术网

Java 如何从另一个类运行方法,但该类是字符串

Java 如何从另一个类运行方法,但该类是字符串,java,minecraft,bukkit,Java,Minecraft,Bukkit,所以我的项目中有很多课程。其中一个叫做CommandManger,command,create。CommandManger正在访问command.java中的一个void方法(run)。我在create.java中还有一个名为run的方法。我正在尝试在command中的run方法中使用create中的run方法 public void run(CommandSender sender, String[] args) throws ClassNotFoundException, IllegalAc

所以我的项目中有很多课程。其中一个叫做
CommandManger
,command,create。
CommandManger
正在访问command.java中的一个void方法(run)。我在create.java中还有一个名为run的方法。我正在尝试在command中的run方法中使用create中的run方法

public void run(CommandSender sender, String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    String className = args[0];
    Object c = Class.forName(className).newInstance();
    ArrayList<String> a = new ArrayList<String>(Arrays.asList(args));
    a.remove(0);
    c.run(sender, a.toArray(new String[a.size()]));
}

我在这里遇到的问题是无法识别run方法。但是,每个类都将从该方法调用它。

您使用反射来创建对象,所以您应该使用反射来调用它方法:

Class<?> cl = Class.forName(className);
Object c = cl.newInstance();
String[] params = a.toArray(new String[a.size()]);
Method method = cl.getDeclaredMethod("run", CommandSender.class, params.getClass());
method.invoke(c, new Object[] {sender, params});
Class cl=Class.forName(className);
对象c=cl.newInstance();
String[]params=a.toArray(新字符串[a.size()]);
方法Method=cl.getDeclaredMethod(“run”,CommandSender.class,params.getClass());
调用(c,新对象[]{sender,params});

或者,您可以对所有类使用一个接口,然后将对象c转换为该接口。

只要它们都在扩展一个公共类或接口(例如,
Runnable
),您就可以转换并调用该类型的方法。不确定要创建的是命令的扩展,并且命令不会扩展任何内容。CommandManager扩展CommandExecutor。然后确保它确实扩展了它。@JustinLevy不要忘记向上投票,并将接受状态赋予帮助您的答案!
Class<?> cl = Class.forName(className);
Object c = cl.newInstance();
String[] params = a.toArray(new String[a.size()]);
Method method = cl.getDeclaredMethod("run", CommandSender.class, params.getClass());
method.invoke(c, new Object[] {sender, params});