此方法会定期调用
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/