0

现在我想写一个这样的方法:

public String getObjName(Object obj)

此方法返回此对象的名称,例如,

Student stu = new Student();
String objname = getObjName(stu);

然后 objname 将是“stu”。

我学到了很多关于 java 反射的知识,但我仍然对这个问题感到困惑,每个提示都会有所帮助。

4

4 回答 4

1

您无法使用反射获取变量名称。您只能获取类名:

stu.getClass().getName();
于 2013-09-25T08:02:38.190 回答
1

你可以使用这个类:

public final class NamesCollector 
{
   final static Map<String, Object> ALL_NAMES = new WeakHashMap<String, Object>();

   private NamesCollector(){}

   public static <T> T createObject(Class<T> clazz, String name) 
   {
      final T retVal;
      try
      {
         retVal = clazz.newInstance();
      }
      catch (final Exception ex)
      {
         throw new RuntimeException(ex);
      }
      ALL_NAMES.put(name, retVal);
      return retVal;
   }

   public static String getObjName(Object obj)   
   {
      for (Entry<String, Object> entry : ALL_NAMES.entrySet()) 
      {
         if (entry.getValue().equals(obj)) 
         {
             return entry.getKey();
         }
      }
      return null;
   }
} 

用法:

Student stu =  NamesCollector.createObject(Student.class, "stu");
String name = NamesCollector.getObjName(stu);
于 2013-09-25T08:05:41.387 回答
1

您不能在运行时访问局部变量的名称。除此之外,它相当无用,如下例所示:

Student stu = new Student();
Student stu2 = stu;

getObjName(stu); // should return "stu"
getObjName(stu2); // should return "stu2"

同一个对象有两个不同的“对象名称”?更好用.toString()

于 2013-09-25T08:06:15.910 回答
1

首先我认为这是不可能的。这样做的原因是你不会得到对象的名称,而是对它的引用。看例子:

    Student stu = new Student();
    Student stu2 = stu;
    String objname = getObjName(stu);

你认为它会写哪个名字?您可以获取实例类的名称,但实例引用变量的名称,我不这么认为。

此外,字节码中的变量引用表示并不总是与您在代码中看到的相同。

于 2013-09-25T08:06:18.043 回答