我可以在Java中获得当前引用的名称吗?

时间:2009-12-18 13:17:16

标签: java reference

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中实现这一点吗?

感谢。

6 个答案:

答案 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()

“参考”甚至没有名字。