现在我想写一个这样的方法:
public String getObjName(Object obj)
此方法返回此对象的名称,例如
Student stu = new Student();
String objname = getObjName(stu);
然后objname将是“stu”。
我学到了很多关于java反思的知识,但我仍然对这个问题感到困惑,每个提示都会有所帮助。
答案 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);
你认为它会写哪个名字?您可以获取实例类的名称,但是实例引用变量的名称,我不这么认为。
此外,变量引用表示在字节码中并不总是与您在代码中看到的相同。