假设您创建一个对象:
class newClass{
public static void main(String[] args){
Object o = new Object();
}
}
是否可以将给定对象的名称作为字符串“o”或任何形式返回?
假设您创建一个对象:
class newClass{
public static void main(String[] args){
Object o = new Object();
}
}
是否可以将给定对象的名称作为字符串“o”或任何形式返回?
不,这是不可能的。如果你真的想要这个,你可能使用了错误的设计。请注意,对象没有名称。变量确实有名称。
不,对象不知道外界如何称呼它,即它有什么引用。
是否可以在 Java 中返回对象的名称?
如果你写这样的东西:
String name = obj.toString();
它将返回对象的字符串表示,但这不是很可读。如果你想这样做,你需要创建自定义对象并覆盖 toString() 方法:
public class MyObject {
private String name;
public String toString() {
return name;
}
}
现在当你写:
String name = myObj.toString();
它将以人类可读的形式返回名称。但是,如果您想创建自定义对象,这取决于您的要求。通过这种方式,它非常简单并且效果很好。
这是不可能的。
您可以使用 aMap<String, Object>
存储从对象名称到对象值的映射,然后返回键。
实际上,对象的“名称”是一个编译时间常数。即,一旦你编译了代码,它就不会改变,所以
Object o = new Object();
return "o";
字面上会做你想做的事。这就引出了一个问题,你为什么要这样做?
使用 java 反射是不可能的。但是,如果在编译时带有调试信息,则该信息存储在 java 类文件中。您可以使用像ASM这样的字节码工程库来挖掘它。
注意:我刚刚阅读了 sajmon 的答案,他在一定程度上有更优雅的方式
首先大家的答案是正确的
但
如果你真的需要它
我会用 MyObject 之类的东西扩展 Object 类
public class MyObject {
private String objectName;
public MyObject(){
}
public MyObject(String name){
setObjectName(name);
}
public getObjectName(){
return this.objectName;
}
public setObjectName(String name){
this.objectName = name;
}
}
但是每次创建 Object 时,请改用 MyObject 实例并将对象名称添加为构造函数参数
MyObject mine = new MyObject("mine");
话虽如此,但为什么您可能需要它仍然是一个悬而未决的问题?:)
由于 Java 支持别名,这确实是不明智或不可能的。别名意味着没有保证一个对象只被一个变量引用。
范围界定只会使整个问题变得更加困难,因为此时只有当前范围内的引用才有用。并且可能不止一个。
如果您解释了您要使用此代码实现的目标,将会有所帮助。
除了前面的答案之外,可能还有几个不同的变量,具有不同的标识符,它们都引用了同一个对象。一个变量可以在不同的时间引用不同的对象。
如果您需要从对象到字符串的映射,我建议使用Map<Object,String>
.