Java中如何获取调用方法的对象名称?
问题分析
你遇到的核心问题是:Java虚拟机不会保存对象引用变量的名称(比如代码里的obj1)。当你打印this时,实际上调用的是Object类的默认toString()方法,输出格式为类名@十六进制哈希码,这就是你看到ProgLang@2f92e0f4的原因。getName()是Class类的方法,用来获取类名,不能直接替换this,所以会报错。
解决方案
要实现打印"对象名称"的需求,你需要手动给对象添加存储名称的逻辑,因为JVM不会帮你记录这个信息。下面提供两种可行的方式:
方法1:给类新增名称字段,构造时传入
修改ProgLang类,新增一个字段存储你想显示的对象名称,创建对象时传入该名称:
class ProgLang { String language; String objectName; // 用于存储对象的"名称" // 构造器同时接收语言和对象名称参数 ProgLang(String lang, String objName) { this.language = lang; this.objectName = objName; } void getField() { System.out.println("Programming Language of " + this.objectName + " : " + this.language); } } public class ConstructorOverLoading { public static void main(String[] args) { // 创建对象时传入引用名作为对象名称 ProgLang obj1 = new ProgLang("Python", "obj1"); obj1.getField(); } }
运行后输出:
Programming Language of obj1 : Python
方法2:调用方法时传入对象名称
如果不想修改类的结构,可以在调用getField()时把引用名作为参数传进去:
class ProgLang { String language; ProgLang(String lang) { this.language = lang; } // 修改方法,新增对象名称参数 void getField(String objName) { System.out.println("Programming Language of " + objName + " : " + this.language); } } public class ConstructorOverLoading { public static void main(String[] args) { ProgLang obj1 = new ProgLang("Python"); // 调用方法时传入引用名 obj1.getField("obj1"); } }
运行后同样能得到预期输出。
补充说明
- 引用变量名只是代码层面的标识符,和对象本身没有绑定关系。比如你可以把
obj1重新赋值给另一个变量obj2,此时对象本身没有变化,但引用名变了,JVM不会追踪这种变化。 - 如果只是想让
toString()输出更友好,可以重写ProgLang类的toString()方法,但这也只能输出对象的属性,没法直接获取引用名。
内容的提问来源于stack exchange,提问作者prateek khanal
相关产品推荐
相关产品推荐

