我想显示用于传递给方法的对象实例的变量名。我可以取"incoming"对象,查看它声明的字段,并查看它的变量名,但我想知道是否有一种简单的方法可以显示该名称。
我想我可以得到一个堆栈跟踪,得到调用类的类名,然后使用类加载器,反映该类的字段和方法,寻找相同的类型,但这很混乱,也不是万无一失的。
我要查找的变量名不是在方法的参数列表中指定的,而是在调用我的方法的类中使用的变量名。
例如
public class Ralph{
String punch = "mouth";
public void doIt(){
GetInfo.showIt(punch);
}
}
public class GetInfo{
public static void showIt(Object obj){
System.out.println("variable name = punch");
}
}
显然不是可编译的代码,但这正是我希望能够在showIt()方法中了解的。
你不能这么做。变量名称在运行时不存在。
"变量名"的含义是什么?如果您的对象没有命名变量怎么办?
即,如果有人呼叫showIt("punch")
怎么办?
如果对象被两个、三个或更多的变量引用,该怎么办。
即,如果你有怎么办
String foo = "hello"
String bar = foo;
String baz = foo;
showIt(bar); // you're just passing in the same object referred to by 3 variables
这是一个XY问题,如果我见过的话。你应该专注于并询问你试图解决的整体问题,而不是你的错误解决方案。
也许你想用地图代替?
即
Map<String, FooType> fooMap = new HashMap<String, FooType>();
fooMap.put("Jim", new FooType("Jim"));
// later
FooType myJim = fooMap.get("Jim");
Java的关键是不要关注变量名,因为在编译的代码中,它们几乎不存在。而是关注引用——如何处理所选对象。有很多方法可以做到这一点,例如,如果您想将对象与字符串相关联,可以使用"映射",或者使用数组或ArrayLists将对象与int相关联。
此外,我看到你标记了你的问题反思,但请注意,反思在这里没有帮助。同样,你需要做的是重新思考,重新设计你的程序,这样你就不需要这个要求了。
编辑
您所在的州:
我试图解决的问题是获取变量的名称。如果"变量名称"不明确,很抱歉。也许我应该叫它域名。如果我将一个类传递到我的对象中,我可以获得它声明的字段,并执行field.getName(),然后查看代码中用于声明该变量的名称。因此,我想找到用于传递给这个发现类的对象的字段名。如果这不可能,就这么说吧。
是的,正如许多人告诉你的那样,这是不可能的。
我想我把我的问题说得很清楚。这是为了调试/记录目的。
不,你没有。您已经陈述并重申了您的代码尝试问题,但没有告诉我们尝试这种方法的理由。你仍然在追求错误的马,仍然给我们带来xy问题。我们需要知道的是这背后的细节,你的"This is for debug/logging purposes"
声明背后的背景。