Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Java中获取当前引用的名称吗?_Java_Reference - Fatal编程技术网

我可以在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(

正如上面的代码所示,我可以在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();   // 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();
    }
}