GWT的思考

2009年12月5日由恩里克 留下一个回复»

简介

在反省线以下,今天我们看到一个简单的反射,使我们能够在一个类的实例方法调用的名字。

为什么?

反思是一个有趣的功能,这是必不可少的设计时的通用组件。 我们可以创建一个类的名称或一个类的实例也调用的一个具有方法的名称类的实例方法。 这一点,例如,它极大地简化了命令模式的实现。

如何? 什么?

在GWT(至少到1.7)没有反映。 我们在这做的是反思的实施提供了按名称调用方法的机制。 假设我们有一个名为MyClass的类有一个名为MyMethod的 ,我们可以这样做的方法:

  MyClass的实例=新MyClass的(); 
  NombreMetodo的String =“MyMethod的”; 
  对象[]参数=新对象[]{...}; 
  调用(例如,nombreMetodo,参数); 

输入发电机!

我们要做的是GWT生成MiClaseReflection类。 如何? 使用发电机。 这是一个非常有趣的GWT功能。 本文的重点是解释发电机,在互联网上有很多文献。 这里是一个 只是不必成为专家,了解我们做什么。

基本上,我们将编写一个类,生成MiClaseReflection代码,其中有一个方法调用,它是一个链条,如果还有谁... ... ELSEIF要求每个MyClass的方法,如果有匹配,调用。 这将是这样的:

  如果(nombreMetodo.equals(“miMetodo1”)){ 
  target.miMetodo1(参数)/ /无效 
  }否则,如果(nombreMetodo.equals(“miMetodo2”)){ 
  target.miMetodo2返回(参数)/ /不作废 
  否则{} 
  抛出新的异常(“方法未找到:”+ nombreMetodo); 
  } 

显然缺少参数检查。

为了避免作出任何朝着建立与一些外部工具类汇编,我们将使用API​​,它为扩展GWT编译器(com.google.gwt.core.ext)已一步。 注意:那些谁使用的Java APT会看到一个(几个相似之处http://java.sun.com/javase/6/docs/technotes/guides/apt/index.html )。

当GWT编译器遇到的声明GWT.create(类),它返回一个接口实现类发电机调用的类(该协会是在模块gwt.xml声明)关联的接口。 该发电机是“写”的代码,实现了接口类。 为了写这个代码已获得API,这是非常令人想起com.google.gwt.core.ext.typeinfo API Java反射镜的协助。

生成

指令GWT.create()接受一个接口,并返回它的一个实现。 然后,我们定义一个接口的品牌,我们会打电话反映。 任何一种你想要的反射支持将不得不实现这个接口:

  反映{公共接口 
  } 

然后,类MyClass:

  公共类反映{MyClass的实现 
  miMetodo1无效(); 
  miMetodo2 INT(); 
  } 

我们还需要有反射界面语言:

  公共接口扩展<I Reflectable> {反思 
  对象的invoke(我的目标,弦乐methodName中,对象... PARAMS) 
  InvocationException抛出; 
  } 

对于使用MyMethod的讨论和假设没有参数:

  MyClass对象=新MyClass的(); 
  反思反思= GWT.create <MiClase>(MiClase.class); 
  reflection.invoke(对象,“MyMethod的”); 

要关联的接口发生器反映,添加以下代码段:

  类=“com.aquait.utils.gwt.rebind.ReflectionGenerator”> <产生,与 
  类=“com.aquait.utils.gwt.reflection.Reflectable”/> <当型可分配 
  </生成,与> 

因此,当GWT编译器GWT.create(MiClase.class),称为发电机作为MyClass的实现体现。 然后我们有一个接​​口为MyClass的实施反映。

对于在一个项目中使用,添加在<module>的这个Gwt.xml:

  名称=“com.aquait.utils.gwt.Reflection”/> <继承 

该JAR可以在这里下载: 内省的reflection4gwt.jar

注:此JAR有一个内省的更新版本,消除getIntrospectable方法()和setIntrospectable()反思接口。 因此,该方法的getProperty()和setProperty()作为第一个参数的内省。

Blogger帖子 DIGG 书签交易 谷歌阅读器 分享
广告

3个评论

  1. 佩佩 说:

    都好,但仍不得不通过类字面MiClase.class没用,他们必须事先知道它是什么样,有一个对它的引用。 正如你知道的类的名称单独实例在运行? 你不能把该GWT不会让你怎么做。 唯一的解决这个问题是有一个有限的类和预先处理发电机和成库或记录插入。 例如。 register.add(新GWT.create(MiClase.class)),那么调用严重register.invocarmetodo(“类”,“办法”)。 这导致了事先知道所有可能的类使用的问题。

  2. 恩里克 恩里克 说:

    你说的一切,是的,除了它是无用的 :)
    我还会见了这些挑战,并实施登记就好像你说的结束。
    然后,我意识到,GWT并不支持静态初始化当“负荷”类(即使在新的时间运行)。
    也给了我们很好的效果。 这已久,但我觉得我们用做一个通用的用户菜单组件,可以配置和数据库中存储什么的。
    问候和感谢的投入。

  3. 佩佩 说:

    对不起,没用,我知道我没有表达。 我已经使用记账域类自动生成用户界面。 类似的方法,但与GWT的OpenXava。 基本上是“狮子座”JPA注解和我自己在运行时创建一个包装器,它包含需要得到该类DONE的信息。 然后在Ex - GWT和我有一个组件运行时AbmMenuItem表明您一个完整的反导这个类,其中包括过滤器,有特殊成分报名表找到与多对一例如关联的对象。
    问候。

发表评论

垃圾邮件保护WP验证码-免费