gpt4 book ai didi

java - loading jar时如何知道调用方是哪个

转载 作者:行者123 更新时间:2023-11-30 07:20:32 25 4
gpt4 key购买 nike

考虑一个包含三个应用程序的场景。A、B、C

A 由 B 使用 Class.LoadFrom 加载。A 也可以从 C 加载A 也可以作为独立应用启动

问题是,A能找到谁加载了A还是它自己启动了。

我试图找到进程名称,但没有帮助。如果它能告诉我,试图找到使用类加载器。也没有帮助。尝试使用我想避免的 StackTraces,但这根本不是一个好习惯。我想避免设置属性文件,因为它需要一些手动操作。

在 .Net/C# 中非常简单 :(

编辑:

看看这个,这在 Java 中可行吗?

System.Reflection.Assembly.GetEntryAssembly

最佳答案

Thread.getAllStackTraces()可能工作。 - 或者走上ThreadGroup hierarchy到顶部并从根 ThreadGroup 获取所有线程(getParent() == null)。

然后检查 main() 方法的堆栈跟踪并找出它的包/类名称可能会对您有所帮助。

检测“独立”模式很容易:当您的 main() 方法在您的其他代码之前运行时,您就是独立的。

public class MyMainClass {

private static boolean standalone = false;

public static boolean isStandalone() {
return standalone;
}

public static void main(String[] args) {
standalone = true;

// Run as usual...

}

}

然后您的任何代码都可以调用 MyMainClass.isStandalone() 来确定它是否独立运行。

确定哪个应用程序正在运行您的代码,当它不处于独立模式时,会有些困难,并且如果没有堆栈跟踪可能无法完成,堆栈跟踪并不总是完全可靠,而是某种启发式。

如果您知道应用程序 B 中存在哪些类但 C 中不存在,反之亦然,您也可以尝试通过 Class.forName() 找到其中之一;如果该调用因 ClassNotFoundException 而失败,则您知道相关类在当前运行时环境中可用,并且可能能够推断出哪个应用程序正在运行。

为每个应用程序定义某种应用程序全局属性肯定是一个更好的主意,然后可以由您的代码对其进行评估。

关于java - loading jar时如何知道调用方是哪个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13966618/

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