Как я могу получить имя объекта в Java? - PullRequest
9 голосов
/ 24 мая 2010

вот так, A a = new A (), как я могу получить имя a? (Получить строку "a" из a)?


Здесь JPanel содержит несколько JTextFields, карта содержит все имена JTextFields (имена переменных). Я хочу установить значения карты в тексты JTextFields.

public void mapToJPanel(Map map, JPanel panel) {
    Component[] compArr = panel.getComponents();
    for (Component comp : compArr) {
        if (comp.getClass().getSimpleName().equals("JTextField")) {
            JTextField textField = (JTextField) comp;
            textField.setText(map.get(textField.getName()).toString());//getName() method
        }
    }
}

По методу getName () я получаю null -_- Я знаю, что метод getName () не используется для получения имени переменной. Я использую NetBeans для разработки Java Swing Visual, поэтому я не могу переписать компоненты (например, JTextField).

Ответы [ 9 ]

16 голосов
/ 24 мая 2010

Вы не можете, потому что у объекта нет имени. Для примера рассмотрим следующее:

A a = new A();
A b = a;

Какое теперь имя * экземпляра A? Это "a"? Это "b"?

А что по этому поводу?

A[] a = new A[] { new A(), new A()};
a[0] = a[1];

Каково "имя" экземпляра в a[1]?

Я хочу сказать, что вы не можете придумать полезное / пригодное для использования определение универсального имени объекта Java, которое работает в широком диапазоне контекстов. Проблемы, связанные с препятствиями, включают:

  • Стабильность имени: «имя», которое изменяется при назначении ссылки на объект, не полезно.
  • Одно имя: объект не должен иметь одновременно несколько имен.
  • Реализуемость: любая система именования должна быть реализуемой без ущерба для производительности при обычном использовании объектов. AFAIK, это невозможно ... по крайней мере, на оборудовании, которое мы сейчас используем.

Самое близкое, что Java приходит к имени для объекта, - это значение "хэш-кода" объекта. Он не уникален, но обладает свойством, которое не будет изменяться в течение всего времени жизни объекта в текущей JVM. (Но даже хэш-код удостоверения стоит времени исполнения ... что, по мнению некоторых людей, делает его ошибкой проектирования Java.)

Разумный подход к именованию объектов заключается в том, чтобы (как уже говорили другие) добавлять поля "name" в соответствующие классы (или использовать существующий) и управлять именами самостоятельно, как требуется.


В более конкретном случае, когда «объект» на самом деле является JComponent, нельзя полагаться, что данный компонент имеет имя. (Метод getName() может возвращать null.) Однако, если вы хотите, вы можете пересечь любую иерархию JComponent и установить имя для любых компонентов в зависимости от ситуации.

6 голосов
/ 24 мая 2010

Вы можете использовать Component.setName() для присвоения имен компонентам Swing и AWT.

6 голосов
/ 24 мая 2010

Вы не можете.

Если вы компилируете с символами отладки, тогда файл .class будет содержать таблицу имен переменных (именно так отладчики отображают переменные обратно в ваш исходный код), но нет гарантииэто будет там и не будет отображаться во время выполнения.

1 голос
/ 24 мая 2010

Вы не можете, и кажется, что вы делаете что-то не так, если вам нужно это сделать.Однако, если вы действительно хотите следовать изложенной логике, почему бы вам не сделать следующее:

Добавьте элемент String в A и в конструкторе назначьте его.Как то так:

 A a = new A('a');
0 голосов
/ 28 июля 2015

У меня была такая же проблема, посмотрите это решение ...

    DocumentoMB mb = new DocumentoMB();
    System.out.println(mb.getClass().getSimpleName());
0 голосов
/ 28 апреля 2015

Вы всегда можете создать переменную имени в классе объекта и использовать эту переменную рядом с другими для передачи информации об этом объекте.

0 голосов
/ 11 июля 2013

Вы можете попытаться определить новый объект, который расширяет (явно или просто в функции) исходный объект с новым полем String для имени объекта. Затем предоставьте методы для получения этого имени, когда вам это нужно. Этот подход сработал довольно хорошо для меня.

0 голосов
/ 28 января 2011

Копирование названия (символа) a - это то, что неудобно и немного шумно. На языке с макросами это можно определить так, чтобы копирование было автоматическим в программе с исходным кодом.

make(A, a);

или makeA (а)

0 голосов
/ 24 мая 2010

Хотя вы можете легко получить имя класса переменной, вызвав .getClass (). GetCanonicalName () или .getClass (). GetSimpleName () (в зависимости от того, хотите ли вы полное имя), это не так просто. чтобы получить имя переменной. Байт-код Java не должен сохранять имена локальных переменных (которые представлены с помощью операций push / pop в стеке); однако байт-код Java может содержать исходные имена в комментариях. Таким образом, вы можете попробовать прочитать файлы .class из файлов .jar и попытаться извлечь имена переменных из файлов .class, предполагая, что компилятор включил их в качестве комментариев. Что касается переменных-членов (то есть полей), вы можете использовать отражение, чтобы получить имена полей класса.

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