&引用$Java中的0(程序名)?发现主类?“;再一次

&引用$Java中的0(程序名)?发现主类?“;再一次,java,command-line-arguments,Java,Command Line Arguments,我发现了以下问题: 但在这种情况下,公认的答案失败了: public class Derived extends Base { } class Base { public static void main(String[] args){ System.out.println(getTheClassName()); } static String getTheClassName(){ StackTraceElement[] stack =

我发现了以下问题: 但在这种情况下,公认的答案失败了:

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();
    }
}
打电话时:

java Derived
不幸的是,输出是
Base
而不是
派生的

有可能得到真正的主类的名称吗?(顺便说一句,
jps
工具正确地检测主类,但要获得正确的名称,我需要知道当前VM的ID,这也是一个问题)

致以最良好的祝愿

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

Edit2:全球回复索比约恩的回答:

对于您的工作方法,您需要一个非静态方法。成功 非静态,在派生中使用main()执行新的派生()。getTheClassName()

我想知道我不需要在派生类中实现main方法就可以得到这个名称


解决方案:我将提供(Thorbjørn和erickson)两种
派生类初始化机制;-)所有的答案都很有帮助。我接受了托比约恩的回答,因为他比埃里克森更早地给出了答案。谢谢。

入口点位于
中时,您为什么希望
派生
?声明为
static
的成员属于其类,不会被继承。按原样运行程序时,甚至不会加载类
派生的
,因为它从未被引用


考虑将派生类的名称作为
Base
类的参数。除了使目标类显式之外,它可能是实现其他特性的一个方便的地方

class Base {
  public static void main(String... argv) throws Exception {
    Class<?> clz = Class.forName(argv[0]);
    Method mth = clz.getMethod("main", String[].class);
    String[] sub = new String[argv.length - 1];
    System.arraycopy(argv, 1, sub, 0, sub.length);
    mth.invoke(null, sub);
  }
}
类基{
公共静态void main(字符串…argv)引发异常{
Class clz=Class.forName(argv[0]);
方法mth=clz.getMethod(“main”,String[].class);
String[]sub=新字符串[argv.length-1];
System.arraycopy(argv,1,sub,0,sub.length);
mth.invoke(null,sub);
}
}

静态方法属于定义它们的类,而不是类的实例(与静态/非静态方法相同)。因此,当您位于getTheClassName内部时,您位于基类中定义的静态方法中

对于您的工作方法,您需要一个非静态方法。使其非静态,在派生中使用main()执行新的派生()。getTheClassName()

尝试以下操作:

for(final Map.Entry<String, String> entry : System.getenv().entrySet()){
    if(entry.getKey().startsWith("JAVA_MAIN_CLASS"))
        return entry.getValue();
}
for(最终映射。条目:System.getenv().entrySet()){
if(entry.getKey().startsWith(“JAVA\u MAIN\u CLASS”))
返回条目.getValue();
}

但你还是应该看看其他人的答案。即使这样做有效,这也是一种非常糟糕的做法。

我希望
派生的
,因为正如我所说,
jps
工具将
派生的
打印到
stdout
。确切地说:我需要知道,什么类(或类文件)最初作为命令行参数传递给
java
command。哇,我很惊讶启动器接受
Derived
作为类名,因为它不包含
main
方法。
jps
实用程序必须访问传递给本机C
main
方法的
argv[0]
信息。我已经简要介绍了实现-它使用
MonitoredHost
MonitoredVm
类。需要明确的是:在我的示例中,
派生的
类将加载到内存中,因为我可以在类声明中的
静态
块中执行一些代码。这些代码依赖于实现。我知道您发布的解决方法,但我想知道我不需要在
派生
类中实现
方法就可以得到名称。据我所知,这在纯Java中是不可能的。但是,您可以通过JMX或JVM特定的方法询问HotSpot,但这将是一个特定于供应商的解决方案。你为什么需要这个?我需要这个用于某种应用程序框架:我将提供一个main方法的实现;框架的用户将只从
Base
类派生,并且将能够使用我的增强
main
运行他/她的类。告诉用户在其基本派生类中有一个
公共静态void main(String[]args){Your.boost.main.main(args);}
代码段。但坦率地说,我认为您应该要求用户向增强的main提供一个派生实例(…)谢谢您的回答;-)