【问题标题】:How to get the main class name in java [duplicate]如何在java中获取主类名[重复]
【发布时间】:2012-12-26 04:38:35
【问题描述】:

如何在我的 java 执行的任何时候获取主类名。我想要的只是我需要从我的执行开始的地方获取类名。例如,

package mypackage;
class A
{
public static sayName()
{
 System.out.println("Here i have to print the class name B");
}
}


package test;
import mypackage.A;

class B
{
public static void main()
{
A.sayName();
}
}

提前致谢

【问题讨论】:

  • 我不认为你可以。如果您现在在另一个线程上运行,它甚至可能不在堆栈跟踪中。
  • 你想达到什么目的?
  • 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。
  • @Thilo 是的,你的权利,我很抱歉重复。

标签: java stack-trace


【解决方案1】:

看看这是否有效。

StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
StackTraceElement main = stack[stack.length - 1];
String mainClass = main.getClassName ();

但我不确定如果此代码的执行除了主线程之外还有另一个控制线程,它是否会起作用。

【讨论】:

  • 这又是有用的。尝试使用 Thread.getAllStackTraces()。它从所有正在运行的线程返回堆栈跟踪的 Map,而不仅仅是当前线程。
  • 是的,它的工作。非常感谢
  • 如果启动 main() 的线程结束了怎么办?
【解决方案2】:

试试这个

public static String getMainClassName()
{
  for(final Map.Entry<String, String> entry : System.getenv().entrySet())
  {
    if(entry.getKey().startsWith("JAVA_MAIN_CLASS"))
      return entry.getValue();
  }
  throw new IllegalStateException("Cannot determine main class.")
}

这可能有效,但它不能在 JVM 之间移植。

【讨论】:

  • 不,它对我不起作用,无论如何,谢谢。但上述技巧奏效了。
【解决方案3】:

我将创建一个额外的持有者类来保存主类名。类似的东西:

public class MainClassHolder{
    private static String className = null;

    public static void setClassName(String name) {
         className = name;
    }
    public static String getClassName() {
         return className;
    }
} 

然后在主要方法中,您将 className 设置为 holder

package mypackage;
class A
{
public static sayName()
{
 System.out.println(MainClassHolder.getClassName());
}
}


package test;
import mypackage.A;

class B
{
public static void main()
{
    MainClassHolder.setClassName(B.class.getName());
    A.sayName();
}
}

【讨论】:

  • 是的,好主意。但是当我们在一个更注重记忆的项目中工作时,这个想法将不是一个好的解决方案。无论如何,感谢您的努力。如果我在获取堆栈跟踪时遇到任何问题,让我使用这个解决方案。感谢您的努力。
  • @Karthikeyan,我不会担心内存问题。只有一个类有一个静态字段。但是,即使这对您来说也很重要 - 这不是很好的解决方案。
  • 你是对的,当我通过测试框架运行脚本时,我遇到了上述解决方案,其中,在主类之前调用​​了一些类,所以 stack[0] 不返回我的主班。你太棒了。感谢您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2013-03-09
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多