如何在GWT中使用反射机制?
在GWT中,Java的很多机制都是不支持的,比如:
????? 不支持类的动态加载
????? 不支持Java的反射机制
????? 不支持标准Java序列化
????? 不支持WEB模式下的Java对象清理
????? 不支持strictfp关键字,要避免在客户端代码中进行精确精度的计算
????? ......
?
如果我们想让GWT支持反射机制,可以使用GWT Reflection框架扩展实现。以下简单介绍其实现步骤:
?
1、到http://gwtreflection.sourceforge.net/网站下载GWT Reflection框架文件,将ant.jar、antlr-2.7.7.jar、commons-cli-1.0.jar、gwtr-core.jar、gwtr-emule.jar、stringtemplate.jar这些jar文件拷贝到工程的lib目录下。
?
2、修改gwtr-emule.jar的JavaToJSArrayUtil.java源文件,将包含long和Long的代码段去掉,重新编译后覆盖gwtr-emule.jar里面对应的class文件和java文件。
????? 如果不这样做的话,在启动工程时会抛出以下异常信息:
?????????? [ERROR] Errors in 'jar:file:/E:/gwtext/web/WEB-INF/lib/gwtr-emule.jar!/pl/rmalinowski/gwtreflect/client/utils/JavaToJSArrayUtil.java'
????????????????? [ERROR] Line 90: Parameter 'value': type 'long' is not safe to access in JSNI code
?
????? 那是因为:
?????????? 在GWT1.5中,现在Java long类型可以正确的工作,允许你给一个64位的整数一个完全适当的范围。然而,由于JavaScript缺少真正的64位整型,long 被视为一对32位整型,使用JavaScript的标准数学符号不能很好的工作。
?????????? 如果你给JSNI传入一个long型值,GWT1.5编译器会产生错误,此时在你不完全需要long范围的地方,推荐方式是把类型改为double 。事实上,如果你使用long返回System.currentTimeMillis(),我们推荐你使用新建的Duration类来作为替换方式。对于JSNI 方法来说,它使用派生对象(opaque objects 不能进行任何数学计算)来处理long 值,你可以使用UnsafeNativeLong? annotation 来欺瞒编译器。但是我们强烈建议您避免这种方式,因为很容易忘掉JSNI方法中该值是一个非数值型的。?
?
?
???? 修改pl.rmalinowski.gwtreflect.tool.AntAttributeStrategy类的源码为:
??
?? 对于范例中的TicketRecievePanel类,将生成以下两个Java类:
??????? TicketRecievePanel__GWTR??? 反射代理类
????????ClassRegistrator?? 反射代理类的注册类。一个包下有一个注册类
?
5、需要在模块配置文件增加以下信息:?
<inherits name="pl.rmalinowski.gwtreflect.GWTReflect"/>?