这是代码。
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.class和HelloJava4.class的Invoke和HelloJava4目录
如果我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.
答案 0 :(得分:4)
在您未经编辑的代码中,将从此行抛出异常。
Method theMethod = theClass.getMethod(args[1]);
它甚至没有达到参数数量的if / else条件。
答案 1 :(得分:2)
java -cp Invoke; HelloJava4调用HelloJava4 param1 param2 param3
这是不对的。我不知道你使用什么操作系统或用什么shell来执行该行。
我不认为:
-cp Invoke; HelloJava4
是对的。 (我之所以这么说是因为你遇到了无法重现的问题。)
要验证,请执行您提供给我们的代码段,不要使用任何-cp或-classpath。
编辑: 如果我们假设-cp参数是正确的。 这意味着jvm以类路径中的目录Invoke和HelloJava4启动(-cp / -classpath覆盖指定类路径的环境变量),jvm将查看Invoke类的目录Invoke和HelloJava4。这意味着您可能正在执行另一个类,而不是您认为的那样。
您的示例代码位于默认包中。 只需转到源文件所在的目录并执行:
javac Invoke.java
java -cp . Invoke param1 param2 param3 [...]
(关键是当前目录在类路径中......)
你应该看到不同的结果。