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
};
如上面的代码所示,我可以在Java中实现这一点吗?
感谢。
答案 0 :(得分:3)
无法完成。下面会打印什么?
RefName a = new RefName(), b;
(b = a).outRefName();
答案 1 :(得分:3)
rf1
只是变量的名称,所以即使你可以使这个工作,它也不是一个类的方法 - 毕竟,你可能有:
RefName rf1 = new RefName();
RefName rf2 = rf1;
这是同一个实例; rf1.outRefName()
应该产生什么?不,我认为你不能做到这一点。在C#中有一些hacky方法(涉及捕获的变量以及反射或表达式树检查),但同样 - 你得到变量名称 - 与对象无关。这里更好的方法可能是为您的类提供Name
成员并在构造函数中初始化名称:
RefName rf1 = new RefName("myname");
此处,对象的名称为“myname”。不是rf1
,这是变量的名称。
答案 2 :(得分:2)
如果此信息有价值,您需要在您自己中传递此信息。
public class RefName {
private String name;
public RefName(String name) {
this.name = name;
}
public String outRefName() {
System.out.println(name);
}
}
-
RefName rf1 = new RefName("rf1");
rf1.outRefName();
答案 3 :(得分:2)
通过使用Reflection,您可以找到Object的哪些字段包含给定实例。这仅适用于字段,不适用于变量。这是一个不完整的样本:
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();
}
}
这是一个(大)黑客攻击,但是我曾用它一次显示保存了点击的GUI组件的字段......
答案 4 :(得分:1)
想象一下,我们是同伴,当我向家人提及你时,我们会使用某种绰号。让我们说'前几天我 tall colleagu说'这个'。你无法知道我们如何打电话给你。不是吗?
答案 5 :(得分:1)
这不能用Java完成。我想你可以在这里清楚地看到原因:
(new RefName()).outRefName()
“参考”甚至没有名字。