0

私はコードをもっている:

abstract void run();

public void start() {
    Logger log = Logger.getLogger(Test.class.getName());
    try {
        run();
    } catch (Exception e) {
        log.warn(e.getMessage());
    }       
}

start()たとえば、次のように実行できます。

object1.start();
object2.start();
object3.start();

start()どのオブジェクト (名前オブジェクト) がメソッドを開始したかを確認するにはどうすればよいstart()ですか?

4

5 に答える 5

2

これを自動的に行う方法はありません。Java のオブジェクトは名前を持つ必要はありません。

1つの解決策は次のとおりです。

public void start(String name) {
    Logger log = Logger.getLogger(name);
}

これは、ロガーが任意の名前を持つことができるため機能します。多くのロガーはクラスの名前を使用します。これは、ロガーに名前を付けるための単純で自動的な方法だからです。しかし、それは必要ではありません。

于 2012-10-10T13:21:01.063 に答える
2

名前として「object1」、「object2」、「object3」を取得しようとしていると仮定すると (明確ではありません)、次の 2 つの点に注意する必要があります。

  • これらは変数であり、オブジェクトではありません。異なる名前を持つ複数の変数が同じオブジェクトを参照する可能性があります。
  • 通常、オブジェクトには名前がありません。独自のnameフィールドを追加できますが、明示的に行う必要があります。
于 2012-10-10T13:21:29.630 に答える
1

文字列を取得する場合"object1":これは論理的には意味がありません。これは、参照するオブジェクトではなく変数の名前であり、実行時には存在しません。実際、コンパイラそれを完全に最適化する可能性があります。さらに、それはあいまいです:

次のコードを検討してください。

object2 = object1;
object2.start();

インスタンスに名前"object1"または?が表示され"object2"ますか?両方です!

オブジェクトに「名前」を付けたい場合は、自己管理フィールドを使用して保存します。

object1.setName("object2");

または、コンストラクターで同じことを行います。

MyObject object1 = new MyObject("object1");
于 2012-10-10T13:22:31.383 に答える
1
new Exception().getStackTrace()[1]

StackTraceElementを参照してください

于 2012-10-10T13:23:58.297 に答える
0

実行時に変数の名前を取得することはできません。

start()メソッドの外でログを開始します

Logger log = Logger.getLogger(object1);
object1.start(log);

次に、start()メソッドは次のようになります。

public void start(Logger log) {    
    try {
        run();
    } catch (Exception e) {
        log.warn(e.getMessage());
    }       
}

または、start()署名を変更できない場合:

Logger log;
public void setLogger(Logger log){
    this.log = log;
}
public void start() {    
    try {
        run();
    } catch (Exception e) {
        log.warn(e.getMessage());
    }       
}

それで:

Logger log = Logger.getLogger(object1);
object1.setLogger(log);
object1.start();
于 2012-10-10T13:30:32.950 に答える