是否可以在GWT客户端使用Java反射API?我想使用反射在JavaBean上查找属性值。这是否可行?
是否可以在GWT客户端使用Java反射API?我想使用反射在JavaBean上查找属性值。这是否可行?
public Object getProperty(String propertyName){}
我们将这个类称为IntrospectionBean
。
假设您已经定义了您的bean:
public class MyBean extends IntrospectionBean {
private String prop1;
private String prop2;
}
GWT生成器将可以访问MyBean的所有字段,并且在GWT编译时期间,通过迭代MyBean的所有字段来生成getProperty(String propertyName)
方法。
生成的类可能像这样:
public class MyBean extends IntrospectionBean {
private String prop1;
private String prop2;
public Object getProperty(String propertyName) {
if ("propr1".equals(propertyName)) {
return prop1;
}
if ("propr2".equals(propertyName)) {
return prop2;
}
return null;
}
}
你可以简单地使用myBean.getProperty("prop1")
来根据属性名称在运行时检索属性。
这里有一个实现GWT生成器的例子。由于GWT代码被翻译成JavaScript,因此不支持直接使用反射API。
有一个名为GWT-Reflection的小项目,可以在GWT中使用反射。
GWT不完全支持反射,您可以查看以下链接:
http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsCompatibility.html
您需要注意Java和JavaScript之间的边界。在GWT中,所有代码都编译为JavaScript,因此您必须检查JavaScript是否是一个定义良好的反射。
https://github.com/WeTheInternet/xapi/tree/master/gwt/gwt-reflect
https://github.com/WeTheInternet/gwt-sandbox/tree/xapi-gwt/user/src/com/google/gwt/reflect
// Embeds all data needed to perform reflection into hidden fields of class
GwtReflect.magicClass(SomeClass.class);
SomeClass.getField(fieldName).set(null, 1);
// Allows direct reflection, provided ALL parameters are literals, or traced to literals
SomeClass.class.getField("FIELD_NAME").set(null, 1);
// Skips creating a Field object entirely, and just invokes the accessor you want
// All params must be literals here as well
GwtReflect.set(SomeClass.class, "FIELD_NAME", null, 1);
package com.foo;
class SomeClass {
private String someField;
private static int someInt;
}
//accessors:
native String ripField(SomeClass from)
/*-{
return from.@com.foo.SomeClass::someField;
}-*/;
native int ripInt()
/*-{
return @com.foo.SomeClass::someInt;
}-*/;
此外,我正在完成java.lang.Class
newInstance
/ 反射的仿真。
如果您想玩一下,我将在大约两天后在这里发布一个链接。
它需要您通过一个方法传递一个类,我将其路由到自定义生成器
(像GWT.create
,但它返回一个生成的java.lang.Class,其中包含指向jsni方法/字段的字段和方法访问器。 :)