&引用$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
实用程序必须访问传递给本机Cmain
方法的argv[0]
信息。我已经简要介绍了实现-它使用MonitoredHost
和MonitoredVm
类。需要明确的是:在我的示例中,派生的
类将加载到内存中,因为我可以在类声明中的静态
块中执行一些代码。这些代码依赖于实现。我知道您发布的解决方法,但我想知道我不需要在派生
类中实现主
方法就可以得到名称。据我所知,这在纯Java中是不可能的。但是,您可以通过JMX或JVM特定的方法询问HotSpot,但这将是一个特定于供应商的解决方案。你为什么需要这个?我需要这个用于某种应用程序框架:我将提供一个main方法的实现;框架的用户将只从Base
类派生,并且将能够使用我的增强main
运行他/她的类。告诉用户在其基本派生类中有一个公共静态void main(String[]args){Your.boost.main.main(args);}
代码段。但坦率地说,我认为您应该要求用户向增强的main提供一个派生实例(…)谢谢您的回答;-)