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

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

所以我的项目中有很多课程。其中一个被称为CommandManger,命令,创建。 CommandManger正在访问command.java中的void方法(run)我在create.java中也有一个名为run的方法我试图在run方法命令中使用create方法。

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方法。它正在向玩家(发送者)发送字符串数组。由于CommandManger中的措施将始终存在正确数量的参数,并且第一个参数将始终具有要引用的类。但是我在这里可能不完全正确。我想要做的是在方法内部创建和创建类的实例。在这种情况下,args[0]是字符串“创建”参数,它是我需要发送到create类中的run方法的参数。这是这样的:

ArrayList<String> a = new ArrayList<String>(Arrays.asList(args));
a.remove(0);
c.run(sender, a.toArray(new String[a.size()]));

我遇到的问题是无法识别run方法。但是每个班级都会从这个方法中调用。

java minecraft bukkit
1个回答
2
投票

您使用反射来创建对象,因此您应该使用反射来调用它的方法:

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

或者你可以为你的所有类使用1个接口,然后将Object c强制转换为该接口。

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