我可以在Java中获取当前引用的名称吗?
正如上面的代码所示,我可以在Java中实现这一点吗我可以在Java中获取当前引用的名称吗?,java,reference,Java,Reference,正如上面的代码所示,我可以在Java中实现这一点吗 谢谢。不行。下面的打印内容是什么 public class RefName { void outRefName() { System.out.println("the current reference name is" + xxx); }; }; public static void main(String[] args) { RefName rf1 = new RefName(); rf1.outRefName(
谢谢。不行。下面的打印内容是什么
public class RefName {
void outRefName() {
System.out.println("the current reference name is" + xxx);
};
};
public static void main(String[] args) {
RefName rf1 = new RefName();
rf1.outRefName(); // should be rf1
RefName rf2 = new RefName();
rf2.outRefName(); // should be rf2
};
rf1
只是变量的名称,因此即使您可以使其正常工作,它也不是类的方法-毕竟,您可以:
RefName a = new RefName(), b;
(b = a).outRefName();
这是同一个实例;rf1.outRefName()应该产生什么?不,我认为你做不到。在C#中,有一些老套的方法(包括捕获变量和反射或表达式树检查),但同样——你得到的是变量名——与对象无关。这里更好的方法可能是为类指定一个名称
成员,并在构造函数中初始化名称:
RefName rf1 = new RefName();
RefName rf2 = rf1;
这里,对象的名称为“myname”。不是rf1,这是变量的名称。想象一下我们是同事,当我向我的家人提到你时,我们使用某种昵称。让我们说‘前几天我的高个子同事这么说了’。你没办法知道我们怎么称呼你。不是吗?如果此信息是有价值的,您需要自己将此信息传递给
RefName rf1 = new RefName("myname");
-
这不能在Java中完成。我想你可以清楚地看到为什么会这样:
RefName rf1 = new RefName("rf1");
rf1.outRefName();
“引用”甚至没有名字。通过使用反射,您可以找到对象的哪些字段包含给定实例。这只适用于字段,不适用于变量。这里有一个不完整的样本:
(new RefName()).outRefName()
这是一种(大的)攻击,但我曾经用它来显示单击的GUI组件保存在哪个字段中 你为什么需要这个?关于:System.out.println(rf1.toString());有时我需要打印引用名来区分对象。它似乎工作得很好。为什么会发生这种情况?后面的十六进制是对象的堆地址吗?
(new RefName()).outRefName()
public class BackRef {
private class RefName {
// finds first field containing this object
public String outRefName() {
Field[] fields = BackRef.class.getDeclaredFields();
for (Field field : fields) {
if (getClass().isAssignableFrom(field.getType())) {
field.setAccessible(true);
try {
if (field.get(BackRef.this) == this)
return field.getName();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
return null;
}
}
private RefName ref1;
private RefName ref2;
BackRef() {
ref1 = new RefName();
ref2 = new RefName();
System.out.println(ref1.outRefName());
System.out.println(ref2.outRefName());
}
public static void main(String[] args) {
new BackRef();
}
}