考虑有三个应用程序的场景。 A,B和C
A使用Class.LoadFrom加载A. A也可以从C加载 A也可以作为独立应用启动
问题是,A可以找到加载A或者自己开始的人。
我试图找到进程名称,但这没有帮助。 试图找到使用类加载器,如果它可以告诉我。也没帮助。 尝试使用我想避免的StackTraces,但它根本不是一个好习惯。 设置属性文件是我想要避免的,因为它需要一些手动操作。
<。>在.Net / C#中很容易:(修改:
看看这个,这在Java中是否可行?
答案 0 :(得分:2)
您可以使用线程名称来标识启动进程的类,这是一个示例。票务系统,它有自己的访问权限。
public class TicketingSystem {
public TicketingSystem() {
System.out.println("Accessing by : " + Thread.currentThread().getName());
}
public void bookATicket() {
// some process
}
public static void main(String[] args) {
Thread.currentThread().setName("T.System");
TicketingSystem ticketingSystem = new TicketingSystem();
}
}
访问TicketingSystem
public class TicketAgent {
public static void main(String[] args) {
Thread.currentThread().setName("Agent");
TicketingSystem ts = new TicketingSystem();
ts.bookATicket();
}
}
访问TicketingSystem
public class Customer {
public static void main(String[] args) {
Thread.currentThread().setName("Customer");
TicketingSystem ts = new TicketingSystem();
ts.bookATicket();
}
}
希望这个答案能帮到你。
答案 1 :(得分:2)
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
,您知道当前运行时环境中有问题的类不,并且可能能够推断出正在运行的应用程序。
为每个应用程序定义某种应用程序全局属性肯定是一个更好的主意,然后可以通过代码对其进行评估。