0

这是代码。

import java.lang.reflect.*;

class Invoke {
    public static void main(String[] args) {
        int ret;

        if (args.length<2) {
            System.out.println("Usage: Invoke <class> <method>");
            return;
        }

        if (args.length == 2) {
                ret = 2
        } else {
            System.out.println("Additional parameters not yet supported.");
            return;
        }

        System.out.println("Results: " + ret);
    }
}

问题是,即使我用类似的东西运行程序......

java -cp Invoke;HelloJava4 Invoke HelloJava4 param1 param2 param3

...它仍然将“param1 param2 param3”识别为一个参数。注意:我的系统的类路径设置为C:\JavaSource,所以-cp Invoke;HelloJava4让它在 Invoke 和 HelloJava4 目录中搜索 Invoke.class 和 HelloJava4.class

如果我这样做System.out.println(args.length);,它将输出给定的正确数量的参数,但是当我使用以下if语句检查它时,它运行if代码块,而不是else代码块。

if (args.length == 2) {
    ret = 2
} else {
    System.out.println("Additional parameters not supported yet.");
    return;
}

是什么赋予了?:使困惑:

这是未经编辑的完整代码:

import java.lang.reflect.*;

class Invoke {
    public static void main(String[] args) {
        Object ret;

        for (String arg : args)
            System.out.println(arg);

        System.out.println("Count: " + args.length + " \n");

        if (args.length<2) {
            System.out.println("Usage: Invoke <class> <method>");
            return;
        }

        try {
            Class theClass = Class.forName(args[0]);

            Method theMethod = theClass.getMethod(args[1]);
            if (args.length == 2) {
                System.out.println("Invoking method " + args[1] + " within class " + args[0]);
                ret = theMethod.invoke(null);
            } else {
                // pass parameters to .invoke() if more than two args are given
                // for now, just exit...

                System.out.println("Parameter passing not yet supported.");
                return;
            }

            System.out.println("Invoked static method: " + args[1] 
            + " of class: " + args[0]
            + " with no args\nResults: " + ret);
        } catch (ClassNotFoundException e) {
            System.out.println("Class (" + args[0] + ") not found.");
        } catch (NoSuchMethodException e2) {
            System.out.println("Class (" + args[0] + ") found, but method does not exist.");
        } catch (IllegalAccessException e3) {       
            System.out.println("Class (" + args[0] + ") and method found, but method is not accessible.");
        } catch (InvocationTargetException e4) {
            System.out.println("Method threw exception: " + e4.getTargetException() );
        }
    }
}

这是它给出的确切输出:

C:\JavaSource>cd invoke

C:\JavaSource>javac invoke.java
Note: invoke.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

C:\JavaSource>cd ..

C:\JavaSource>java -cp Invoke;HelloJava4 Invoke HelloJava4 param1 param2 p
aram3
HelloJava4
param1
param2
param3
Count: 4

Class (HelloJava4) found, but method does not exist.
4

2 回答 2

4

在您未经编辑的代码中,从这一行抛出异常。

Method theMethod = theClass.getMethod(args[1]);

它甚至没有达到参数数量的 if/else 条件。

于 2012-06-03T20:23:00.440 回答
2

java -cp Invoke;HelloJava4 调用 HelloJava4 参数 1 参数 2 参数 3

那是不对的。我不知道您使用什么操作系统或什么外壳来执行该行。

我不认为:

-cp 调用;HelloJava4

是正确的。(我之所以这么说是因为您遇到了不可重现的问题。)

要进行验证,请执行您提供给我们的代码片段,而不使用任何 -cp 或 -classpath。

编辑:如果我们假设 -cp 参数是正确的。这意味着 jvm 从类路径中的目录 Invoke 和 HelloJava4 启动(-cp/-classpath 覆盖指定类路径的环境变量),jvm 将在目录 Invoke 和 HelloJava4 中查找 Invoke 类。这意味着您可能正在执行另一个类,而不是您认为的。

您的示例代码位于默认包中。只需转到源文件所在的目录并执行:

javac Invoke.java
java -cp . Invoke param1 param2 param3 [...]

(重点说当前目录在类路径中......)

你应该会看到不同的结果。

于 2012-06-03T19:49:05.313 回答