Java中重写toString方法时如何无需新增字段获取对象引用名
问题解答
Java 语法层面不支持在类实例方法内部直接获取指向该实例的变量标识符,原因是:
- 变量名属于编译期的代码标记,运行时 JVM 不会存储变量名和对象实例的绑定关系
- 同一个对象实例可以被任意多个变量同时引用,逻辑上也不存在唯一的「对象标识符」
可行实现方案(满足不新增类成员字段的要求)
方案1:修改调用处的输出逻辑,手动拼接变量名
不需要修改Student类的任何代码,直接调整打印语句即可:
// 原打印语句 // System.out.println(student1); // 替换为以下代码 String originToString = student1.toString(); String result = originToString.replaceFirst("Student\\{", "Student{student1, "); System.out.println(result);
如果有多个不同变量名的实例需要打印,可以封装成工具方法:
public static String printStudent(String varName, Student student) { return student.toString().replaceFirst("Student\\{", "Student{" + varName + ", "); } // 调用示例 System.out.println(printStudent("student1", student1)); System.out.println(printStudent("student2", student2));
方案2:新增带参输出方法(仅新增方法、不新增成员字段)
如果不想在调用处处理字符串,可以给Student类新增一个带参数的输出方法,不需要新增成员字段:
// 在Student类中新增方法 public String toString(String varName) { return "Student{" + varName + ", id=" + this.id + '}'; } // 调用时传入变量名即可 System.out.println(student1.toString("student1"));
不推荐方案:通过栈追踪解析调用处代码提取变量名,该方法依赖编译时保留调试信息、性能极差、稳定性极低,仅可作为调试玩具使用,不能用于生产环境。
内容的提问来源于stack exchange,提问作者Kinnlm
相关产品推荐
相关产品推荐

