我想显示用于传递给方法的对象实例的变量名称。我可以使用'传入'对象并查看它的声明字段并查看它的变量名称,但我想知道是否有一种简单的方法来显示该名称。
我以为我可以得到一个堆栈跟踪并获取调用类的类名,然后使用类加载器并反映该类的字段和方法寻找相同的类型,但这只是凌乱而不是万无一失。
我要查找的变量名不是方法参数列表中指定的变量名,而是调用my方法的类中使用的变量名。
例如
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()方法中知道的。
答案 0 :(得分:5)
你不能这样做。变量名称在运行时不存在。
答案 1 :(得分:4)
"变量名称"是什么意思?如果您的对象没有命名变量怎么办?
即如果有人打电话给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 Problem。您应该专注于并询问您尝试解决的整体问题,而不是您的错误解决方案。
也许您想要使用地图?
即,
Map<String, FooType> fooMap = new HashMap<String, FooType>();
fooMap.put("Jim", new FooType("Jim"));
// later
FooType myJim = fooMap.get("Jim");
Java的关键不是关注变量名,因为在编译代码中,它们几乎不存在。而是专注于 引用 - 您将如何处理所选对象。有很多方法可以做到这一点,包括地图,如果你想将一个对象与一个String相关联,或者使用数组或ArrayLists将一个对象与一个int相关联。
此外,我看到您标记了您的问题reflection,但请注意,反射在这里没有帮助。您需要做的就是重新思考,重新设计您的计划,以便您不需要这个要求。
修改强>
你说:
我想解决的问题是获取变量的名称。对不起,如果&#34;变量名称&#34;很模糊也许我应该称它为字段名称。如果我将一个类传递给我的对象,我可以获取它的声明字段并执行一个field.getName()并查看代码中用于声明该变量的名称。所以我想找到用于传递给此发现类的对象的字段名称。如果那是不可能的,那就这么说吧。
是的,正如多位人士告诉你的那样,这是不可能的。
我想我说的问题很简单。这是为了调试/记录目的。
不,你没有。您已经使用代码尝试声明并重述了您的问题,但没有告诉我们想要尝试此方法的理由。你仍在追找错误的马,并仍在向我们展示xy problem。我们需要知道的是这背后的具体细节,即"This is for debug/logging purposes"
声明背后的背景。