有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Groovy调用Java类主方法时,避免参数数量不正确

从Groovy类方法中,我试图调用默认包中Java类的主函数(我知道不是最优的,但使用的是遗留代码)

我尝试使用Java反射教程中的修改版本:

Class<?> c = Class.forName(className)
Class[] argTypes = new Class[] { String[].class }
Method main = c.getDeclaredMethod("main", argTypes)
String[] mainArgs = Arrays.copyOfRange(args, 0, args.length)
main.invoke(null, mainArgs)

这会引发一个IllegalArgumentException,如下所示:

线程“main”java中出现异常。lang.IllegalArgumentException:参数数目错误

其他需要注意的事项:

  • argTypes[0]class [Ljava.lang.String
  • mainpublic static void AClassName.main(java.lang.String[])
  • mainArgsjava.lang.String[6]

Groovy和Java是否有不同的实现方法?否则,如何从默认包类调用main


共 (1) 个答案

  1. # 1 楼答案

    找到了。。。在默认包中给定此Java类

    import java.util.List;
    
    public class Main {
      public static void main(String[] args) {
        System.out.println(List.of(args));
      }
    }
    

    在这个问题的帮助下https://stackoverflow.com/a/22022402/6509

    我们可以做到这一点(这是您的代码,稍微有点Groovized,根据另一个问题,在字符串[]周围有一个对象[]包装器):

    import java.lang.reflect.Method
    
    Class c = Class.forName("Main")
    Class[] argTypes = [String[]]
    Method main = c.getDeclaredMethod("main", argTypes)
    
    String[] mainArgs = ['hello', 'tim']
    main.invoke(null, new Object[] { mainArgs })
    

    当我们运行Groovy脚本时,我们得到了输出:

    ➜ groovy test.groovy
    [hello, tim]
    

    这适用于Groovy Version: 3.0.8 JVM: 11.0.6 Vendor: Azul Systems, Inc. OS: Mac OS X顺便说一句,以防您看到不同的:-)