反射可以取到原始调用方法的变量名吗?

08-09-22 chabulier
小弟愚昧,想知道Java可不可以实现这样的功能。

Class A{
public void methodA1(){
String oriName = "Class A methodA1 field";
ClassB instanceB = new ClassB();
instanceB.methodB1(oriName );
}
}

Class B{
public void methodB1(String inStr){
    //我可不可以在这里得到调用次方法的原始的变量名称(比如oriName)?
    System.out.println("inStr=" + inStr);
}
}


翻看了几个Java的反射代码好像需要知道名称才能取得属性,那我就很困惑了,能不能得到引用取得名称呢?
想到Java虚拟机最后会把变量当作reference指向同一块内存,所以应该可以有方法实现遍历或者逆推得到原来的变量名。

请大家积极发言。。。

[该贴被chabulier于2008-09-22 18:30修改过]

banq
2008-09-23 10:53
问题没有描述清楚,oriName 是方法参数,就是inStr

chabulier
2008-09-23 15:07
抱歉没有描述清楚。这个例子来里面刚好使用了String可能有些歧义。把他当成一个普通对象好了。

方法参数inStr,在调用他的地方传入的是oriName,当然我们可以打印inStr来显示oriName的值,但是有没有什么方法可以打印出来调用当前方法的原始变量名oriName?

因为方法调用可能是嵌套了很多层,感觉这个不是很容易做到。

说白了就是当获得了一个对象以后,想知道在特定方法中该对象引用的名称。

freebox
2008-09-23 16:42
我猜想是类似这样的:
class TestClass{
public void myMethod(String myMethodString){}
}
之后有个类:
class TestDo{
public void doTest(){
Class clazz=TestClass.class;
//要在这里根据clazz取得字符串"myMethodString"
}
}
这个好像做不到,变量名可以由编译器按规则给出来,存在各种实现,不能保证被编译成同一个名。

fox0424
2008-09-23 19:12
如果是楼上说的情况就不用想了,这是形参与实参的问题。

chabulier
2008-09-23 23:46
请教楼上的,什么是形参和实参的问题?

我这个最初的想法来自于一个共通的方法被n个class调用初始化窗体,为了方便逆推当前控件在当前窗体的名称而有了这个想法。

试想一下如果我能够指出当前是什么变量(控件)添加到了窗体中,是不是对后期维护很有帮助呢?

当然了我们可以使用命名规范,或者反射直接提取出当前变量(控件)的内容加以确认。 但是如果可以进一步详细到代码级别不是更好吗?

记得以前有个Windows程序可以显示当前选中的控件的相关信息,不知道是不是一样的原理。

如果象freebox所说,变量名由编译器给出,应该也可以有方法track到变量名称才对。

fox0424
2008-09-24 09:15
我没有明白楼上你的意思,你究竟想实现什么目标??

是你要将窗体控件放入窗体之中,你要了解是谁放的,还是对窗体的上的控件进行管理??

你说的那个windows程序只需要枚举窗体控件即可,显示内容由控件属性决定。

chabulier
2008-09-24 11:13
是要在将窗体控件放入窗体之中时,想要了解是谁放的,放了什么变量名。 也就是说如果我想到那个窗体里面找该控件的话,应该找那个变量,这个是可能的吗?

OK,忘记那个Windows程序好了。

fox0424
2008-09-25 09:58
是要在将窗体控件放入窗体之中时,想要了解是谁放的,放了什么变量名。 也就是说如果我想到那个窗体里面找该控件的话,应该找那个变量,这个是可能的吗?
------------------------------------------------------------------------------
谁放的除非在放的时候作为参数传进去。

后面的还是有点不理解,你要使用窗体里面的控件必须直到名字(活着特征),你可以便利窗体,根据你需要的名字(或者特征)去找。至于叫什么变量名没有什么必要知道。

猜你喜欢