-1

假设您创建一个对象:

class newClass{
    public static void main(String[] args){
        Object o = new Object();
    }
}

是否可以将给定对象的名称作为字符串“o”或任何形式返回?

4

8 回答 8

7

不,这是不可能的。如果你真的想要这个,你可能使用了错误的设计。请注意,对象没有名称。变量确实有名称。

于 2013-08-11T08:54:30.287 回答
3

不,对象不知道外界如何称呼它,即它有什么引用。

于 2013-08-11T08:56:50.607 回答
3

是否可以在 Java 中返回对象的名称?

如果你写这样的东西:

String name = obj.toString();

它将返回对象的字符串表示,但这不是很可读。如果你想这样做,你需要创建自定义对象并覆盖 toString() 方法:

public class MyObject {

   private String name;


   public String toString() {
      return name;
   }
}

现在当你写:

String name = myObj.toString();

它将以人类可读的形式返回名称。但是,如果您想创建自定义对象,这取决于您的要求。通过这种方式,它非常简单并且效果很好。

于 2013-08-11T08:57:49.157 回答
2

这是不可能的。

您可以使用 aMap<String, Object>存储从对象名称到对象值的映射,然后返回键。

实际上,对象的“名称”是一个编译时间常数。即,一旦你编译了代码,它就不会改变,所以

Object o = new Object();
return "o";

字面上会做你想做的事。这就引出了一个问题,你为什么要这样做?

于 2013-08-11T08:57:54.593 回答
1

使用 java 反射是不可能的。但是,如果在编译时带有调试信息,则该信息存储在 java 类文件中。您可以使用像ASM这样的字节码工程库来挖掘它。

于 2013-08-11T08:58:43.510 回答
1

注意:我刚刚阅读了 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");

话虽如此,但为什么您可能需要它仍然是一个悬而未决的问题?:)

于 2013-08-11T09:02:49.383 回答
0

由于 Java 支持别名,这确实是不明智或不可能的。别名意味着没有保证一个对象只被一个变量引用。

范围界定只会使整个问题变得更加困难,因为此时只有当前范围内的引用才有用。并且可能不止一个。

如果您解释了您要使用此代码实现的目标,将会有所帮助。

于 2013-08-11T08:57:28.897 回答
0

除了前面的答案之外,可能还有几个不同的变量,具有不同的标识符,它们都引用了同一个对象。一个变量可以在不同的时间引用不同的对象。

如果您需要从对象到字符串的映射,我建议使用Map<Object,String>.

于 2013-08-11T08:58:15.603 回答