是否有可能在运行时获取对象的声明名称?

时间:2011-01-31 19:10:13

标签: java reflection

假设我在代码中的某处有一个按钮:“JButton closeButton”。我不知道它被称为“closeButton”,但这就是我想要找到的。

在运行时,点击该按钮,一旦它完成,我可以通过反射和AWT api找到很多关于它的信息 - 但我不能做的是找出它在哪里 - 如何在代码中调用它,它被声明为什么名称(“closeButton”)。

是否可以从JVM中找到它?

有没有办法以这样的方式编译和运行代码,以便在运行时保留实例的名称?

在这种情况下,是否有某种类型的'javaagent'(如果可能的话免费)可以帮助我解决这个问题?

由于

编辑(美国东部夏令时间14:23):

我使用一个按钮作为示例,但它可以是任何类型的组件,它可以保存值并附加ActionListeners。我可以通过对该组件的反思来获取每一点信息,但我无法在代码中找到它。即使有10个组件已经声明了相同的名称,这仍然给了我一个领先优势,我可以消除可能性。

4 个答案:

答案 0 :(得分:5)


import java.lang.reflect.*;

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

  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);
      }
   }

}

这应该会为您提供该班级所有字段的列表。

答案 1 :(得分:3)

如果你的“变量”是一个字段,那么使用反射的解决方案(在另一个答案中提到)可以工作。

如果您的变量是局部变量,理论上您可以使用JVMTI代理获取其名称,前提是您使用调试信息编译了类。当你检查时,你的局部变量在范围内。并且没有人改变其价值,并且没有其他变量具有相同的值(在这种情况下,您无法确定哪个是您需要的那个)。

但是,你绝对不应该做任何一件事。它们是理论上的可能性,类似于你自己的努力,以至于你昏倒了。

答案 2 :(得分:0)

我认为你有两种方式:

  1. 使用java调试API,即将程序变成一个小型调试器。
  2. 使用字节码工程库

答案 3 :(得分:0)

简短的回答:这是不可能的。

详细信息:您所谓的name实际上与JButton的实例无关。它只是变量,其中包含允许在运行时访问此实例的引用。这个示例代码将明显地显示这个:

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

这里两个变量都包含对同一个JButton实例的引用。