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

假设您尝试获取“object1”、“object2”和“object3”作为名称(不清楚),您应该注意两件事:

  • 这些是变量,而不是对象。具有不同名称的多个变量可以引用同一个对象。
  • 对象通常没有名称 - 您可以添加自己的name字段,但您必须明确地这样做。
于 2012-10-10T13:21:29.630 回答
2

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

一种解决方案是:

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

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

于 2012-10-10T13:21:01.063 回答
1
new Exception().getStackTrace()[1]

StackTraceElement

于 2012-10-10T13:23:58.297 回答
1

如果您的意思是获取字符串"object1":这在逻辑上是不明智的。这是一个变量的名称,而不是它所引用的对象,并且在运行时不存在。事实上,编译器可能会将其完全优化掉。另外,它是模棱两可的:

考虑以下代码:

object2 = object1;
object2.start();

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

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

object1.setName("object2");

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

MyObject object1 = new MyObject("object1");
于 2012-10-10T13:22:31.383 回答
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 回答