如何在加载jar的情况下知道哪个是来电方

时间:2012-12-20 06:40:51

标签: java classloader

考虑有三个应用程序的场景。 A,B和C

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

问题是,A可以找到加载A或者自己开始的人。

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

<。>在.Net / C#中很容易:(

修改:

看看这个,这在Java中是否可行?

System.Reflection.Assembly.GetEntryAssembly

2 个答案:

答案 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向上走到顶部,并从根ThreadGroupgetParent() == 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,您知道当前运行时环境中有问题的类,并且可能能够推断出正在运行的应用程序。

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