Java 如何查找JVM或现有进程调用的main方法?
考虑到以下代码Java 如何查找JVM或现有进程调用的main方法?,java,Java,考虑到以下代码 public static void main(String...arg){ //do something if(<<the method has called by a new process>>){System.exit(0);} else{System.setProperty("main_result","0");return;} } publicstaticvoidmain(字符串…arg){ //做点什么 if(){System.exit(0)
public static void main(String...arg){
//do something
if(<<the method has called by a new process>>){System.exit(0);}
else{System.setProperty("main_result","0");return;}
}
publicstaticvoidmain(字符串…arg){
//做点什么
if(){System.exit(0);}
else{System.setProperty(“main_result”,“0”);return;}
}
主方法将由JVM或现有进程的分离进程调用,现在如何找到它?提前谢谢 在java中,每个java进程都在自己的JVM中运行。所以,相同的主要原因 方法在正常情况下不能由其他进程调用 环境 即使您运行同一程序两次,它们也将以各自的方式运行 拥有自己的JVM 你可以尝试一件事。。在程序中保留一个静态变量,运行它并 让它长时间睡眠(过程1)。。现在,运行同样的程序 再次编程并更新静态变量(在进程2中运行)。。看,它是否会 在第一个流程中更新(不,不会更新,因为每个流程都有自己的流程 变量集…)
你真的需要它吗?不要使用
System.exit(0)代码>和重构main
方法以优雅地完成
在这两种情况下调用System.setProperty
——当作为新进程和类路径上的类运行时,将不会有任何区别
编辑:找出调用该方法的人并不容易,而且肯定是一种糟糕的做法。让我们澄清一下:可能有另一个类启动了main
,或者以某种方式再次调用了main
通常,您希望调用System.exit(0)
(或return;
?),但从程序本身调用时,您希望以System.setProperty(“main_result”,“0”)结尾代码>
我将按照如下方式重构代码:
public static void main(String...arg){
System.exit(doStuff(arg));
}
public static int doStuff(String... arg) {
//do something
}
在同一JVM内访问此逻辑,现在可以调用<代码> MyClass。doStase并直接获得返回值。
< P>最好考虑重构,并解决这个问题。
否则,以下代码可能会有所帮助:
if(Thread.currentThread().getStackTrace()[1].getClassName().equals(
System.getProperty("sun.java.command"))){
System.out.println("!");
}
如果没有“sun.java.command”属性(在非sun/Oracle JVM上可能不存在)将不起作用。完美,我只是自己测试了这个解决方案,但是如果用户通过反射攻击堆栈或覆盖默认运行时(rt.jar
)包怎么办?Thread.getAllStackTraces()
应该有帮助;见Javadoc。出于安全目的,检查类加载器也会有所帮助。隐藏来电者的方法不多。(祈祷)
if(Thread.currentThread().getStackTrace()[1].getClassName().equals(
System.getProperty("sun.java.command"))){
System.out.println("!");
}