如何发现传递给方法的对象的变量名称

时间:2014-04-09 22:02:59

标签: java reflection

我想显示用于传递给方法的对象实例的变量名称。我可以使用'传入'对象并查看它的声明字段并查看它的变量名称,但我想知道是否有一种简单的方法来显示该名称。

我以为我可以得到一个堆栈跟踪并获取调用类的类名,然后使用类加载器并反映该类的字段和方法寻找相同的类型,但这只是凌乱而不是万无一失。

我要查找的变量名不是方法参数列表中指定的变量名,而是调用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()方法中知道的。

2 个答案:

答案 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相关联。

此外,我看到您标记了您的问题,但请注意,反射在这里没有帮助。您需要做的就是重新思考,重新设计您的计划,以便您不需要这个要求。


修改
你说:

  

我想解决的问题是获取变量的名称。对不起,如果&#34;变量名称&#34;很模糊也许我应该称它为字段名称。如果我将一个类传递给我的对象,我可以获取它的声明字段并执行一个field.getName()并查看代码中用于声明该变量的名称。所以我想找到用于传递给此发现类的对象的字段名称。如果那是不可能的,那就这么说吧。

是的,正如多位人士告诉你的那样,这是不可能的。

  

我想我说的问题很简单。这是为了调试/记录目的。

不,你没有。您已经使用代码尝试声明并重述了您的问题,但没有告诉我们想要尝试此方法的理由。你仍在追找错误的马,并仍在向我们展示xy problem。我们需要知道的是这背后的具体细节,即"This is for debug/logging purposes"声明背后的背景。