首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java中可以在运行时获取对象的声明名吗?

在java中可以在运行时获取对象的声明名吗?
EN

Stack Overflow用户
提问于 2011-02-01 03:10:13
回答 4查看 1.6K关注 0票数 5

假设我在代码中的某个地方有一个按钮:"JButton closeButton“。我不知道它叫"closeButton“,但这就是我想知道的。

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

有没有可能从JVM中找出这一点?

有没有一种方法可以编译和运行代码,使实例的名称在运行时保留?

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

谢谢

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

我以按钮为例,但它可以是任何类型的组件,可以保存值并附加ActionListeners。我可以通过反射获得关于该组件的每一位信息,但我在代码中找不到它。即使有10个组件声明了相同的名称,这仍然给了我一个线索,我可以排除可能性。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-01 03:17:38

简而言之:这是不可能的。

详细信息:您所说的name实际上与JButton的实例无关。它只是一个变量,它保存了允许在运行时访问此实例的引用。此示例代码将更明显地显示这一点:

代码语言:javascript
运行
复制
JButton newButton = new JButton();
JButton otherButton = newButton;

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

票数 0
EN

Stack Overflow用户

发布于 2011-02-01 03:18:07

代码语言:javascript
运行
复制
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);
      }
   }


}


This should give you a list of all the fields of the class.
票数 5
EN

Stack Overflow用户

发布于 2011-02-01 03:22:16

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4854969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档