代码之家  ›  专栏  ›  技术社区  ›  Farouk Alhassan

在GWT客户机中可以使用Java反射api吗

  •  23
  • Farouk Alhassan  · 技术社区  · 14 年前

    可以在GWT客户端使用java反射api吗?我想使用反射来查找Javabean上属性的值。这可能吗?

    6 回复  |  直到 14 年前
        1
  •  12
  •   Joao Pereira    13 年前

    我去过那里,解决方案确实是使用延迟绑定和生成器。您可以在这里看到使用生成器来克服GWT客户机中缺少反射:

    http://jpereira.eu/2011/01/30/wheres-my-java-reflection/

    希望有帮助。

        2
  •  12
  •   Baz    11 年前

    您可以使用GWT生成器功能,该功能允许您在GWT编译阶段生成代码。

    您想要反省的bean可以扩展一个类,该类的方法定义为

    public Object getProperty(String propertyName){}
    

    我们叫这个班 IntrospectionBean .

    假设您的bean定义为:

    public class MyBean extends IntrospectionBean {
        private String prop1;
        private String prop2;
    }
    

    GWT生成器将访问MyBean的所有字段,它可以生成 getProperty(String propertyName) 方法在GWT编译时,在遍历MyBean的所有字段之后。

    生成的类可能如下所示:

    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") 以便在运行时根据属性的名称检索属性。

    Here 您可以找到一个如何实现gwt生成器的示例

        3
  •  10
  •   Faisal Feroz    14 年前

    由于GWT代码被转换为Javascript,因此不支持直接使用反射API。

    有一个小项目 GWT-Reflection ,这允许在GWT中使用反射。

        4
  •  2
  •   Ajax    8 年前

    我已经公开了我的gwt反射库。

    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

    由于试图让Gwt选择我的Class.java版本而不是它自己的类路径问题,我最终创建了Gwt,添加了java 8和反射支持,现在维护了net.wetheinter:Gwt-*:2.7.0,其中包含了这种支持(Gwt 2.8上线后,我将发布一个2.8版本)

    它支持三个级别的反射:

    整体式:

    // 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);
    

    这些示例也适用于方法和构造函数。对注释有基本的支持,将来还会有更多的支持。

        5
  •  2
  •   Mohammad Sadegh Rafiei    6 年前

    GWT不完全支持反射,您可以看到下面的链接:

    http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsCompatibility.html

    您应该注意java和javascript之间的边界。在GWT中,所有代码都编译成javascript,因此必须检查javascript是否是一个定义良好的反射。

        6
  •  0
  •   gevorg Dathan    8 年前

    如果您只想使用反射来获取私有字段,请考虑改用jsni(javascript native interface);它没有私有或公共的概念,因此您可以只获取您想要的任何内容,如下所示:

    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方法/字段的字段和方法访问器。:)