[英]Is it possible to get the declaration name of an object at runtime in java?
让我说我在代码中的某处有一个按钮:“JButton closeButton”。 我不知道它被称为“closeButton”,但这就是我想要找到的。
在运行时,单击该按钮,一旦它完成,我可以通过反射和AWT api找到很多关于它的信息 - 但我不能做的是找出它在哪里 - 如何在代码中调用它,名字是什么它声明为(“closeButton”)。
是否有可能从JVM中找到它?
有没有办法以这样的方式编译和运行代码,以便在运行时保留实例的名称?
是否有某种类型的“javaagent”(如果可能的话,免费)可以帮助我解决这种情况?
谢谢
编辑(美国东部时间14:23):
我使用一个按钮作为示例,但它可以是任何类型的组件,可以保存值并附加ActionListeners。 我可以通过对该组件的反思来获取每一点信息,但我无法在代码中找到它。 即使有10个组件已经声明了相同的名称,这仍然给了我一个领先,我可以消除可能性。
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);
}
}
}
这应该为您提供该类的所有字段的列表。
如果您的“变量”是一个字段,那么使用反射的解决方案(在另一个答案中提到)可以工作。
如果您的变量是局部变量,理论上您可以使用JVMTI代理获取其名称,前提是您使用调试信息编译了类。 当你检查时,你的局部变量在范围内。 并且没有人改变其价值,并且没有其他变量具有相同的值(在这种情况下,您无法确定哪个是您需要的那个)。
但是,你绝对不应该做任何一件事。 它们是理论上的可能性,类似于自己如此努力地打击,以至于你昏倒了。
我认为你有两种方式:
简短的回答:这是不可能的。
详细信息:您所谓的name
实际上与JButton
实例无关。 它只是保存引用的变量 ,允许在运行时访问此实例。 这个示例代码将显示这个mor:
JButton newButton = new JButton();
JButton otherButton = newButton;
这两个变量都包含对同一个JButton实例的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.