2

考虑存在三个应用程序的场景。A、B 和 C

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

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

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

在 .Net/C# 中这很容易:(

编辑:

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

System.Reflection.Assembly.GetEntryAssembly

4

2 回答 2

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();
        }
}

希望这个答案对您有所帮助。

于 2012-12-22T10:39:41.733 回答
2

Thread.getAllStackTraces()可能工作。- 或者将ThreadGroup 层次结构向上移动到顶部并从根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您知道当前运行时环境中没有相关类,并且可能能够推断出哪个应用程序正在运行。

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

于 2012-12-22T11:17:39.277 回答