谁叫了一个方法?

时间:2012-10-10 13:18:15

标签: java

我有一个代码:

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

5 个答案:

答案 0 :(得分:2)

没有自动的方法来做到这一点; Java中的对象不必具有名称。

一个解决方案是:

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

这是有效的,因为记录器可以具有任意名称。许多记录器使用该类的名称,因为这是一种简单的+自动命名记录器的方法。但这不是必要的。

答案 1 :(得分:2)

假设您试图将“object1”,“object2”和“object3”作为名称(目前尚不清楚),您应该注意以下两点:

  • 这些是变量,而不是对象。具有不同名称的多个变量可以引用相同的对象。
  • 对象通常没有名称 - 您可以添加自己的name字段,但是您必须明确地这样做。

答案 2 :(得分:1)

如果你想获得字符串"object1":这在逻辑上是不明智的。这是变量的名称,而不是引用的对象,并且在运行时不存在。实际上,编译器可以完全优化它。另外,它含糊不清:

请考虑以下代码:

object2 = object1;
object2.start();

实例现在应该看到名称"object1"还是"object2"?这是两者

如果您希望对象具有“名称”,请使用自我管理的字段来存储它。

object1.setName("object2");

或在构造函数中执行相同的操作:

MyObject object1 = new MyObject("object1");

答案 3 :(得分:1)

new Exception().getStackTrace()[1]

请参阅StackTraceElement

答案 4 :(得分:0)

如果你想要的话,你无法在运行时获取变量的名称

我会在start()方法之外启动Log

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