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("!");
    }