在java中返回objectname

时间:2013-09-25 07:58:09

标签: java reflection

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

public String getObjName(Object obj)

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

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

然后objname将是“stu”。

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

4 个答案:

答案 0 :(得分:1)

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

stu.getClass().getName();

答案 1 :(得分: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);

答案 2 :(得分:1)

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

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

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

同一个对象的两个不同的'对象名'?更好地使用.toString()

答案 3 :(得分:1)

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

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

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

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