Java 谁调用了一个方法?

Java 谁调用了一个方法?,java,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(); obje

我有一个密码:

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

没有自动方法;Java中的对象不必有名称

一种解决办法是:

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

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

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

一种解决办法是:

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

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

假设您试图将“object1”、“object2”和“object3”作为名称(不清楚),那么有两件事您应该注意:

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

假设您试图将“object1”、“object2”和“object3”作为名称(不清楚),那么有两件事您应该注意:

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

如果要获取字符串“object1”:这在逻辑上是不合理的。这是变量的名称,而不是它引用的对象,并且在运行时不存在。事实上,编译器可能会完全优化它。此外,这是不明确的:

考虑以下代码:

object2 = object1;
object2.start();
实例现在应该看到名称
“object1”
还是
“object2”
?两者都是

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

object1.setName("object2");
或者在构造函数中执行相同的操作:

MyObject object1 = new MyObject("object1");

如果要获取字符串“object1”:这在逻辑上是不合理的。这是变量的名称,而不是它引用的对象,并且在运行时不存在。事实上,编译器可能会完全优化它。此外,这是不明确的:

考虑以下代码:

object2 = object1;
object2.start();
实例现在应该看到名称
“object1”
还是
“object2”
?两者都是

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

object1.setName("object2");
或者在构造函数中执行相同的操作:

MyObject object1 = new MyObject("object1");


请参见

如果需要,则无法在运行时获取变量的名称

我将在start()方法之外启动日志

然后,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());
    }       
}
然后:


如果需要,则无法在运行时获取变量的名称

我将在start()方法之外启动日志

然后,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());
    }       
}
然后:


引用调用方法的当前实例。。你可以玩它..试着使用这个.className();这应该适合您。@Rohit,
仅指当前实例。他的方法是公开的,可以在外部调用。你的评论完全偏离了主题。你到底想知道关于这个对象的什么信息?你可以在创建对象时设置一个名称字段并设置它。使用它来标识对象。引用调用方法的当前实例。。你可以玩它..试着使用这个.className();这应该适合您。@Rohit,
仅指当前实例。他的方法是公开的,可以在外部调用。你的评论完全偏离了主题。你到底想知道关于这个对象的什么信息?你可以在创建对象时设置一个名称字段并设置它。使用它来标识对象。