在最近的编程时,遇到两个类似的问题。
第一个问题:
1)Setup.java类中,给context中name为“score”的传入一个Double型变量,代码如下:
Double score=1.0;
context.put("score",score);
2)setup.vm中,将score填值后,传给对应的action类,name仍未“score”。
<input type="text" name="score">
页面如下图显示,用户填入了“45%”后点击确定
public void doSetup(
@Param(name = "score") Double score,
TurbineRunData rundata,
Context context, Navigator navigator){
}
在页面中填入“45%”,点击确认,在SetupAction.java中debug时,发现score传入的值为空,这个问题好像很容易理解,因为“45%”没有办法转换成Double型。
再看第二个问题:
1) 在Setup.java中,传入了一个List,代码如下:
List<ResInstanceDTO> resList=res.getModel;
context.put("resList", resList);
2) 在setup.vm中:
<input type="hidden" name=" resList " value=" $!{resList} ">
3) 在SetupAction.java中:
public void doSetup(
@Param(name = " resList ") List<ResInstanceDTO> resList,
TurbineRunData rundata,
Context context, Navigator navigator){
}
Debug类SetupAction.java中发现传入的resList为null。
这时就产生疑问了,为什么传入的是一个带泛型的List,通过.vm页面后,传出来的是空呢??
各种想不通,于是求牛人解答,给我的答案是:
1) 不支持这样传
2) 由于反射机制,传入VM的序列,不能正常反射解析为你要的类型。
听到了高端名词“反射”。答案一定在反射机制中。
JAVA语言中的反射机制:
在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法?
对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的信息,以及动态调用类的方法的功能来源于JAVA的反射。从而使java具有动态语言的特性。
JAVA反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
4.在运行时调用任意一个对象的方法(*****注意:前提都是在运行时,而不是在编译时)
JAVA 反射相关的API简介:
位于java。lang。reflect包中
--Class类:代表一个类
--Filed类:代表类的成员变量
--Method类:代表类的方法
--Constructor类:代表类的构造方法
--Array类:提供了动态创建数组,以及访问数组的元素的静态方法。该类中的所有方法都是静态方法
其实看完上述描述后 ,我仍然不是很理解,第二个问题的原因,求大牛解答!!
后续:
原因是webx解析器,这个说法对吗?待验证。