Могу ли я получить имя текущей ссылки в Java? - PullRequest
4 голосов
/ 18 декабря 2009
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 ]

3 голосов
/ 18 декабря 2009

rf1 - это просто имя переменной, поэтому даже если бы вы могли заставить это работать, это не было бы методом класса - в конце концов, вы могли бы иметь:

RefName rf1 = new RefName();
RefName rf2 = rf1;

это тот же экземпляр ; что должен rf1.outRefName() производить? Нет, я не думаю, что ты можешь сделать это. В C # есть несколько хакерских способов сделать это (включая захваченные переменные и либо проверку отражения, либо проверку дерева выражений), но опять же - вы получаете имя переменной - ничего общего с объектом. Лучшим подходом здесь может быть предоставление вашему классу члена Name и инициализация имени в конструкторе:

RefName rf1 = new RefName("myname");

Здесь имя объекта - «мое имя». Не rf1, который является именем переменной.

3 голосов
/ 18 декабря 2009

Не может быть сделано. Что будет напечатано следующее?

RefName a = new RefName(), b;
(b = a).outRefName();
2 голосов
/ 18 декабря 2009

Используя Reflection, вы можете найти, какие поля объекта содержат данный экземпляр. Это работает только для полей, а не для переменных. Вот неполный образец:

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, по которому щелкнули ...

2 голосов
/ 18 декабря 2009

Если эта информация имеет ценность, вам нужно передать эту информацию в самостоятельно .

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();
1 голос
/ 18 декабря 2009

Это не может быть сделано в Java. Я думаю, вы можете ясно видеть, почему здесь:

(new RefName()).outRefName()

«Ссылка» даже не получила имени.

1 голос
/ 18 декабря 2009

Представьте, что мы коллеги, и когда я упоминаю вас членам моей семьи, мы используем какое-то прозвище. Допустим, на днях мой высокий коллега сказал это. У тебя нет возможности узнать, как мы тебе звоним. Не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...