"Java中的$ 0(程序名称)?发现主要课程?" 再次

Daw*_*wid 2 java command-line-arguments

我发现了以下问题: Java中的$ 0(程序名)?发现主要课程? 但接受的答案在这种情况下失败了:

public class Derived extends Base { }

class Base {
    public static void main(String[] args){
        System.out.println(getTheClassName());
    }

    static String getTheClassName(){
        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
        StackTraceElement main = stack[stack.length - 1];
        return main.getClassName();
    }
}
Run Code Online (Sandbox Code Playgroud)

致电时:

java Derived
Run Code Online (Sandbox Code Playgroud)

遗憾的是,输出Base并不Derived像预期的那样.

是否有可能获得真正的主类名称?(btw.jps工具正确检测主类,但要获得正确的名称,我需要知道当前VM的ID,这也是一个问题)

最好的祝福.

编辑:确切地说:我需要知道作为传递给JVM的命令行参数传递的类的名称是什么.jps工具按我想要的方式进行,但由于其他问题(例如未知的VMid),我无法使用此工具.

Edit2:全球回复Thorbjørn的回答:

对于您的工作方法,您需要使用非静态方法.使它成为非静态的,在Derived中有一个main()做一个新的Derived().getTheClassName()

我想知道我可以在Derived类中实现main方法而得到名称.

解决方案:我将提供(Thorbjørn和erickson的)初始化Derived类的机制;-)所有答案都非常有用.我接受托尔比约恩的becase的他张贴了他的答案早于埃里克森.谢谢.

Tho*_*sen 5

静态方法属于它们所定义的类,而不属于类的实例(与静态/非静态方法相同).因此,当您在getTheClassName中时,您处于Base类中定义的静态方法中.

对于您的工作方法,您需要使用非静态方法.使它成为非静态的,在Derived中有一个main()做一个新的Derived().getTheClassName()

  • 告诉用户有一个`public static void main(String [] args){Your.Boosted.Main.main(args); 在他们的Base派生类中的`snippet.但坦率地说,我认为你应该要求用户为你的提升主要提供一个派生实例(..) (2认同)