现在我想写一个这样的方法:
public String getObjName(Object obj)
此方法返回此对象的名称,例如,
Student stu = new Student();
String objname = getObjName(stu);
然后 objname 将是“stu”。
我学到了很多关于 java 反射的知识,但我仍然对这个问题感到困惑,每个提示都会有所帮助。
现在我想写一个这样的方法:
public String getObjName(Object obj)
此方法返回此对象的名称,例如,
Student stu = new Student();
String objname = getObjName(stu);
然后 objname 将是“stu”。
我学到了很多关于 java 反射的知识,但我仍然对这个问题感到困惑,每个提示都会有所帮助。
您无法使用反射获取变量名称。您只能获取类名:
stu.getClass().getName();
你可以使用这个类:
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);
您不能在运行时访问局部变量的名称。除此之外,它相当无用,如下例所示:
Student stu = new Student();
Student stu2 = stu;
getObjName(stu); // should return "stu"
getObjName(stu2); // should return "stu2"
同一个对象有两个不同的“对象名称”?更好用.toString()
!
首先我认为这是不可能的。这样做的原因是你不会得到对象的名称,而是对它的引用。看例子:
Student stu = new Student();
Student stu2 = stu;
String objname = getObjName(stu);
你认为它会写哪个名字?您可以获取实例类的名称,但实例引用变量的名称,我不这么认为。
此外,字节码中的变量引用表示并不总是与您在代码中看到的相同。