我可以从命令行调用main()以外的java方法吗?
谷歌对这些信息不太了解。
由于
答案 0 :(得分:13)
如果你没有主要功能,你可以添加一个,如果你这样做,你可以在顶部添加一系列if-then块。
public static void main(String[] args){
if (args[0].equals("MY_METHOD"))
callMyMethod();
else if(args[0].equals("MY_OTHER_METHOD"))
callMyOtherMethod();
//... Repeat ad nauseum...
else {
//Do other main stuff, or print error message
}
}
然后,从命令行:
$ java [MyPackage.]MyClass MY_METHOD
将运行您的方法。
这是非常hackish - 我几乎可以肯定这不是你想要做的,但是嘿,它回答了这个问题,对吗?
答案 1 :(得分:10)
如果为JVM语言安装REPL(Groovy可能需要最少的工作才能开始),那么您可以在REPL提示符下调用Java方法(Groovy的名称为groovysh)。 groovysh
有一些奇怪的功能(我最不喜欢的是用def
声明变量并不能达到你认为应该做的那样),但它仍然非常有用。这是一个有趣的功能,Groovy不尊重隐私,因此您可以调用私有方法并检查私有变量的内容。
Groovy安装包括groovysh。下载zip文件,将其解压缩到某处,将bin目录的位置添加到路径中,然后就可以了。您可以将jar放入lib文件夹,对于您正在运行的代码和该代码使用的库,Groovy会在那里找到它们。
答案 2 :(得分:4)
这是一个bash函数,可以让你这样做:
function javae {
TDIR=`mktemp -d`
echo "public class Exec { public static void main(String[] args) throws Exception { " $1 "; } }" > $TDIR/Exec.java && javac $TDIR/Exec.java && java -cp $CLASSPATH:$TDIR Exec;
rm -r $TDIR;
}
把它放在〜/ .bashrc中你可以这样做:
javae 'System.out.println(5)'
或者这个:
javae 'class z { public void run() { System.out.println("hi"); } }; (new z()).run()'
当然这是一个黑客,但它确实有效。
答案 3 :(得分:3)
您甚至无法从命令调用main方法。 JVM调用main方法。它只是一个惯例。它总是需要是“public static void main”。
你的用例是什么?
答案 4 :(得分:3)
不,你不能
根据Java command line FAQ(现在已经死了。) 您可以查看Java Threads FAQ
入口点方法main()用于提供启动Java程序的标准约定。方法名称的选择有点武断,但部分设计是为了避免与Thread start()和Runnable run()方法发生冲突。
查看常见问题解答。您将获得有关JAVA命令行的一些很好的知识
答案 5 :(得分:3)
来自The Java Virtual Machine Specification
Java虚拟机通过创建初始类来启动 是以依赖于实现的方式指定的,使用 bootstrap类加载器(第5.3.1节)。然后Java虚拟机链接 初始类,初始化它,并调用其公共类方法 void main(String [])。调用此方法可以进一步驱动 执行。执行Java虚拟机指令 构成主要方法可能导致链接(并因此 创建)其他类和接口,以及调用 其他方法。
所以主要看起来很特别。
答案 6 :(得分:2)
不,我不这么认为。 main()是入口点。这是由语言定义的。当然,您可以围绕main()调用(“Java MyApp arg1 ... argn”)包装脚本,以隐藏名称(甚至隐藏您正在使用Java)并提供您自己的参数语法和解析 - 这是OS提供的功能,当然,也可以通过某种命令行脚本语言。
如果您使用Java创建其他类型的可执行文件,例如Applet或GWT应用程序,那么入口点就不同了,但我认为您正在考虑从命令行运行的可执行文件。
答案 7 :(得分:0)
不,那是不可能的。
请参阅Java语言规范
http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html
当然applet和servlet以及其他技术可能有不同的起点。