gpt4 book ai didi

java - 从 Java 代码中查找主类名称的可移植方法

转载 作者:行者123 更新时间:2023-12-02 08:37:53 26 4
gpt4 key购买 nike

有没有办法从 JVM 中运行的任意代码中找到用于启动当前 JVM 的主类的名称?

任意,我的意思是代码不一定在主线程中运行,或者可能在调用 main 之前在主线程中运行(例如,用户提供的 java.system.classloader 中的代码,其中在 main 之前运行,因为它用于加载 main) - 因此不可能检查调用堆栈。

最佳答案

这是我能得到的最接近的,你可以从这里获取它。我不能保证它是真正可移植的,如果任何方法调用另一个类的主方法,它将不起作用。如果你找到更多,请告诉我清洁溶液

import java.util.Map.Entry;

public class TestMain {

/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(findMainClass());
}

public static String findMainClass() throws ClassNotFoundException{
for (Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces().entrySet()) {
Thread thread = entry.getKey();
if (thread.getThreadGroup() != null && thread.getThreadGroup().getName().equals("main")) {
for (StackTraceElement stackTraceElement : entry.getValue()) {
if (stackTraceElement.getMethodName().equals("main")) {

try {
Class<?> c = Class.forName(stackTraceElement.getClassName());
Class[] argTypes = new Class[] { String[].class };
//This will throw NoSuchMethodException in case of fake main methods
c.getDeclaredMethod("main", argTypes);
return stackTraceElement.getClassName();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
}
}
return null;
}
}

关于java - 从 Java 代码中查找主类名称的可移植方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com