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

Java 如何发现传递给方法的对象的变量名,java,reflection,Java,Reflection,我想显示用于传递给方法的对象实例的变量名。我可以使用“传入”对象,查看它声明的字段,并查看它的变量名,但我想知道是否有一种简单的方法来显示该名称 我想我可以得到一个堆栈跟踪,得到调用类的类名,然后使用一个类加载器,反映该类的字段和方法,寻找相同的类型,但这很混乱,也不是万无一失的 我要查找的变量名不是在方法的参数列表中指定的变量名,而是在调用我的方法的类中使用的变量名 比如说 public class Ralph{ String punch = "mouth"; public voi

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

我想我可以得到一个堆栈跟踪,得到调用类的类名,然后使用一个类加载器,反映该类的字段和方法,寻找相同的类型,但这很混乱,也不是万无一失的

我要查找的变量名不是在方法的参数列表中指定的变量名,而是在调用我的方法的类中使用的变量名

比如说

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()方法中了解的内容。

您不能这样做。变量名在运行时不存在。

什么是“变量名”?如果对象没有命名变量怎么办

i、 例如,如果有人打电话给showIt(“punch”)

如果对象由两个、三个或更多变量引用,该怎么办

i、 如果你有

String foo = "hello"
String bar = foo;
String baz = foo;

showIt(bar); // you're just passing in the same object referred to by 3 variables
这是我见过的最好的。你应该关注并询问你试图解决的整体问题,而不是错误的解决方案

也许你想用地图来代替

i、 e

Map fooMap=newhashmap();
fooMap.put(“Jim”,新的FooType(“Jim”);
//后来
FooType myJim=fooMap.get(“Jim”);
Java的关键不在于关注变量名,因为在编译代码中,它们几乎不存在。而是关注于参考——你将如何处理选择的对象。有很多方法可以做到这一点,例如,如果要将对象与字符串关联,可以使用映射,或者使用数组或ArrayList将对象与int关联

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


编辑
你说:


我试图解决的问题是获取变量的名称。如果“变量名”很模糊,很抱歉。也许我应该叫它域名。如果我将一个类传递到我的对象中,我可以得到它声明的字段,然后执行field.getName()并查看代码中用于声明该变量的名称。因此,我想找到传递给这个发现类的对象所使用的字段名。如果不可能,就说出来

是的,正如许多人告诉你的,这是不可能的

我想我把我的问题说得很清楚。这是为了调试/记录


不,你没有。您已经陈述并重申了代码尝试的问题,但没有告诉我们尝试这种方法的理由。你仍然在追求错误的马,仍然在给我们一个机会。我们需要知道的是这背后的细节,您的
“这是为了调试/记录目的”
语句背后的背景

如果你说
GetInfo.showIt(“嘴”)?在这种情况下,变量的名称是什么?我不关心这种情况。这是为了记录日志,以帮助在我知道不会发生这种情况的代码中进行调试。您可以在运行时反映字段名。字段名,而不是变量名。我试图解决的问题是获取变量名。如果“变量名”很模糊,很抱歉。也许我应该叫它域名。如果我将一个类传递到我的对象中,我可以得到它声明的字段,然后执行field.getName()并查看代码中用于声明该变量的名称。因此,我想找到传递给这个发现类的对象所使用的字段名。如果不可能,就说出来。我想我把我的问题说得很清楚。这是为了调试/日志记录的目的。一个人几乎给了我一个直接的答案,他说“你不能这么做。”。变量名在运行时不存在。这是绝对错误的。您可以获取字段名。但是谢谢你。@bittranp:求你了。我说过字段名“几乎”不存在。如果编译器设置为使它们存在,则它可以存在于调试信息中,但如果不存在,则它们实际上不存在。它们当然不是编译器工作所必需的,而且通常更重要的是对对象的引用,而不是字段名。同样,对象可能有多个引用它们的变量,因此有多个字段名,或者它们可能根本没有,这是您拒绝解决的问题。不客气。@bittramp:你还没有告诉我们想要这些信息的根本原因。为什么?这是国家机密还是商业机密?我不需要解决所有这些人们一直试图加入讨论的“如果”情况。这将用于wsimport为web服务生成的代码中的一小部分。响应、请求结构的形成将确保这里讨论的内容不会继续。此外,在调试soap事务时,字段名在检查XML时非常重要。
Map<String, FooType> fooMap = new HashMap<String, FooType>();
fooMap.put("Jim", new FooType("Jim"));

// later
FooType myJim = fooMap.get("Jim");