我有一个代码:
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()
?
答案 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]
答案 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();