Java - 如何使用类名和方法名作为字符串从另一个类调用方法

标签 java arrays invoke

此方法会定期调用

public static void stynax(String N[]) {
    if (N[1].equals("echo")) { echo.s(); main(); }
    if (N[1].equals("detectos")) { detectos.s(); main(); }
    if (N[1].equals("getuser")) { getuser.s(); main(); }
    if (N[1].equals("exit")) { exit.s(); main(); }
    if (N[1].equals("makefile")) { makefile.s(); main(); }
    if (N[1].equals("cd")) { cd.s(); main(); }
    if (N[1].equals("system")) { system.s(); main(); }
    main();
}

如何调用所有这些方法

system.s();
echo.s();

等等,通过查看类是否存在,然后调用相应的方法。 N[1] 始终是类名。存储此方法的类位于名为 main 的类中,而调用的类位于名为 Commands 的不同包中。

当尝试创建类变量时,我似乎总是遇到此错误,我认为这是主要问题。

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

因此它永远无法调用该方法。

为了简化。

1) 程序获取类名作为字符串 N[1]

2)查看该类是否存在

3) 如果类存在,则通过类名 N[1].s() 调用它;

编辑:使用的导入 导入 java.io.ByteArrayOutputStream; 导入 java.io.FileWriter; 导入java.io.IOException; 导入 java.io.PrintStream; 导入 java.io.PrintWriter; 导入 java.lang.reflect.InitationTargetException; 导入java.lang.reflect.Method; 导入 java.util.Arrays;

import cgameing.Commands.FileBrowser;
import cgameing.Commands.banner;
import cgameing.Commands.cd;
import cgameing.Commands.detectos;
import cgameing.Commands.echo;
import cgameing.Commands.exit;
import cgameing.Commands.getuser;
import cgameing.Commands.makefile;
import cgameing.Commands.system;

编辑结束:

这个对于任何想做同样事情的人来说都是有效的

(Class.forName("commands."+N[1])).getDeclaredMethod("s", null).invoke(null,null);

谢谢大家

最佳答案

您需要使用反射。尝试如下操作。如果您的类位于不同的包中,请使用完全限定的类名而不是 "XYZ"

import java.lang.reflect.*;
import java.lang.*;

public class ReflectionTest {
 public static void main(String[] args)throws NoSuchMethodException,
 ClassNotFoundException,
 IllegalAccessException,
 InvocationTargetException {
  (Class.forName("XYZ")).getDeclaredMethod("ABC", null).invoke(null,null);
 }
}

class XYZ
{
  public static void ABC()
  {
    System.out.println("Lulz");
  }
}  

对于您的用例,考虑到您的类位于 commands 包中(如您在评论中所述)。完全限定名称将为 commands.classname

(Class.forName("commands."+N[1])).getDeclaredMethod("s", null).invoke(null,null);

关于Java - 如何使用类名和方法名作为字符串从另一个类调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37850637/

相关文章:

javascript - 将连续数字分组为 JavaScript 数组中的 "from~to"字符串

.net - 对 Control.Invoke() 的实现感到好奇

Java - 调用方法时的继承和变量类型

java - 等待,通知来自同步上下文的方法

javascript - 使用 Java 在 asp(经典)循环期间查找数组中的第二个最高值

java - 如何将 Java 8 设置为 Mac 上的默认设置?

javascript - 将数组数组转换为组合在一起的对象数组

c# - 从 control.Invoke((MethodInvoker) delegate {/* ... */} 返回值;我需要一些解释

java - 将方法的返回类型设置为调用对象的类型

java - 编辑 Javafx Accordion 的宽度