2

3 つのアプリケーションがあるシナリオを考えます。A、B、C

A は B によって Class.LoadFrom を使用してロードされます。A は C からもロードできます。A はスタンドアロン アプリとして起動することもできます。

問題は、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()て、それが単独で実行されているかどうかを確認できます。

スタンドアロン モードでない場合、どのアプリケーションがコードを実行しているかを判断することは、やや難しく、おそらくスタック トレースなしでは実行できない可能性があります。

Class.forName()アプリケーション B には存在するが C には存在しないクラス、およびその逆がわかっている場合は、 ;を介してそれらの 1 つを見つけることもできます。その呼び出しが で失敗したClassNotFoundException場合、問題のクラスが現在のランタイム環境で使用できないことがわかっているため、どのアプリケーションが実行されているかを推測できる可能性があります。

コードで評価できるように、アプリケーションごとにある種のアプリケーション グローバル プロパティを定義することをお勧めします。

于 2012-12-22T11:17:39.277 に答える