假设您创建了一个对象:
class newClass{
public static void main(String[] args){
Object o = new Object();
}
}
是否可以将名称作为字符串,“o”或任何形式返回给定对象?
答案 0 :(得分:7)
不,这是不可能的。如果你真的想要这个,你可能使用了错误的设计。请注意,对象没有名称。变量确实有一个名字。
答案 1 :(得分:3)
没有。该对象不知道外界称之为什么,即它有什么参考。
答案 2 :(得分:3)
是否可以在Java中返回Object的名称?
如果你写这样的话:
String name = obj.toString();
它将返回对象的字符串表示形式,但这不是人类可读的。如果你想这样做,你需要创建自定义对象并覆盖toString()方法:
public class MyObject {
private String name;
public String toString() {
return name;
}
}
现在你写的时候:
String name = myObj.toString();
它将以人类可读的形式返回名称。但是,如果要创建自定义对象,这取决于您的要求。通过这种方式,它非常简单,效果很好。
答案 3 :(得分:2)
这是不可能的。
您可以使用Map<String, Object>
存储从对象名到对象值的映射,然后返回密钥。
实际上,对象的“名称”是编译时常量。即编译代码后它不会改变
Object o = new Object();
return "o";
真的会做你想要的。这引出了一个问题,你为什么要那样做呢?
答案 4 :(得分:1)
使用java反射是不可能的。但是,如果使用调试信息进行编译,则信息存储在java类文件中。您可以使用像ASM这样的字节码工程库来挖掘它。
答案 5 :(得分: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");
话虽如此,关于你为什么需要它仍然是一个悬而未决的问题? :)
答案 6 :(得分:0)
由于Java支持别名,这实际上是不明智或不可能的。 别名意味着没有代表只有一个变量引用对象。
范围确定只会使整个问题变得更加困难,因为当前范围内的引用只会在此时使用。并且可能不止一个。 如果你用这段代码解释了你想要实现的目标,那将会有所帮助。答案 7 :(得分:0)
除了之前的答案,可能有几个不同的变量,它们都引用同一个对象。变量可以在不同时间引用不同的对象。
如果您需要从对象到String的映射,我建议使用Map<Object,String>
。