Можно ли получить имя объявления объекта во время выполнения в Java? - PullRequest
5 голосов
/ 31 января 2011

Допустим, у меня есть кнопка где-то в коде: "JButton closeButton". Я не знаю, что это называется "closeButton", но это то, что я хочу узнать.

Во время выполнения, эта кнопка нажимается, и как только она это делает, я могу многое узнать об этом с помощью рефлексии и API AWT - НО, что я не могу сделать, это выяснить, где она находится - как она вызывается в коде, какое имя объявлено как ("closeButton").

Возможно ли это выяснить в JVM?

Есть ли способ компилировать и запускать код таким образом, чтобы имена экземпляров сохранялись во время выполнения?

Возможно, существует какой-нибудь тип javaagent (бесплатный, если возможно), который может помочь мне в этой ситуации?

Спасибо

РЕДАКТИРОВАТЬ (14:23 EDT):

Я использую кнопку в качестве примера, но это может быть любой тип компонента, который может содержать значение и к нему прикреплены ActionListeners. Я могу получить каждый бит информации через размышления об этом компоненте, но я не могу найти его в коде. Даже если есть 10 компонентов, которые были объявлены с одним и тем же именем, но это все же дает мне преимущество, я могу исключить возможности.

Ответы [ 4 ]

5 голосов
/ 31 января 2011


import java.lang.reflect.*;</p>

<p>public class field1 {
      private double d;
      public static final int i = 37;
      String s = "testing";</p>

<pre><code>  public static void main(String args[])
  {
     try {
        Class cls = Class.forName("field1");

        Field fieldlist[] 
          = cls.getDeclaredFields();
        for (int i 
          = 0; i < fieldlist.length; i++) {
           Field fld = fieldlist[i];
           System.out.println("name
              = " + fld.getName());
           System.out.println("decl class = " +
                       fld.getDeclaringClass());
           System.out.println("type
              = " + fld.getType());
           int mod = fld.getModifiers();
           System.out.println("modifiers = " +
                      Modifier.toString(mod));
           System.out.println("-----");
        }
      }
      catch (Throwable e) {
         System.err.println(e);
      }
   }

}

Это должно дать вам список всех полей класса.

3 голосов
/ 31 января 2011

Если ваша «переменная» является полем, тогда работает решение с использованием отражения (упомянутое в другом ответе).

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

Однако вы не должны делать ничего из них. Это теоретические возможности, похожие на то, чтобы ударить себя так сильно, что ты теряешь сознание.

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

Краткий ответ: это невозможно.

Детали: То, что вы называете name, на самом деле не имеет ничего общего с экземпляром JButton. Это просто переменная , которая содержит ссылку на которую позволяет получить доступ к этому экземпляру во время выполнения. Этот пример кода покажет это более очевидно:

JButton newButton = new JButton();
JButton otherButton = newButton;

Здесь обе переменные содержат ссылку на один и тот же экземпляр JButton.

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

Я думаю, что у вас есть 2 способа:

  1. использовать API отладки java, т.е. превратить вашу программу в небольшой отладчик.
  2. Использовать библиотеку разработки байт-кода
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...