2011-06-08 98 views
2

可以在gwt中创建动态代理吗?我想创建库 它改变某些类的方法的行为(接口将是 参数),例如,当用户调用类的方法实现 接口时,它将始终返回String“abc”。在java中它会 是这样的:gwt中的动态代理

public class proxyHandler implements InvocationHandler { 
    private Object proxied; 
    public proxyHandler(Object proxied) { 
      this.proxied = proxied; 
    } 
    public Object invoke(Object proxy, Method method, Object[] args) 
        throws Throwable { 
      return "abc"; 
    } 
} 
public static void main(String[] args) { 
    Object object = new Object(); 
    Interface proxy = (Interface) Proxy.newProxyInstance(
      Interface.class.getClassLoader(), 
      new Class[] { Interface.class }, new proxyHandler(object)); 
    System.out.println(proxy.getName()); 
} 

这是可以做到在GWT这样的事情(使用延迟 结合,等等)?感谢您的帮助


但我不想为MyClassOne或MyClassTwo创建代码。我想创建动态代理 - 为任何类型的对象创建一个类(如java代码中的proxyHandler)。我想给用户一个接口/类,然后我向他返回一个对象(如上面的Interface代理),他可以像普通类一样使用它,但它会做更多的事情。


GWT反射未从2007年我还gwittir审查和GWT-ENT更新,但我找不到任何信息如何动态代理在其中

+0

我已经合并了你的两个未注册账户到这一个,你现在应该能够编辑你的问题。另外,我将应该对您的问题进行编辑的答案合并回您的问题中。请不要发布答案,除非它是这个问题的答案。您现在还应该能够使用每个答案下的评论设施来要求澄清。 – 2011-06-08 16:49:59

回答

2

据我所知,你不能:你没有反思GWT。有GWT reflection,但我从来没有使用它。

4

是的,GWT提供了一种“插入”你自己实现的类和接口的方法。 这是通过发电机完成的。

一个例子:

public class MyGenerator extends Generator{ 

    public String generate(TreeLogger logger, GeneratorContext context, 
          java.lang.String typeName) 
          throws UnableToCompleteException { 

     if (someCondition) { 
      return "com.mypackage.MyClassOne" 
     } else { 
      return "com.mypackage.MyClassTwo" 
     } 
    } 
} 

然后用它在你的.gwt.xml文件:

<generate-with class="com.mypackage.MyGenerator"> 
    <when-type-assignable class="com.otherpackage.SomeClass" /> 
</generate-with> 

因此,当需要SomeClass,发电机将在MyClassOneMyClassTwo基于一些条件堵塞。

如果你只需要您的实现来代替一个类/接口,那么你就需要使用发电机,只需在你的GWT模块声明中使用<replace-with>

<replace-with class="com.mypackage.MyClass">    
    <when-type-is class="com.otherpackage.SomeClass"/> 
</replace-with> 

看看这个相关博客文章关于发电机更多的信息:

http://blog.jdevelop.eu/2010/01/17/use-generators-to-create-boilerplate-code-in-gwt-20/

http://blog.jdevelop.eu/2010/01/17/use-generators-to-create-boilerplate-code-in-gwt-20/

0

你可以使用GWT AutoBeans

一个类别执行可另外声明一个拦截器方法来检查和可能的替换的目标接口的所有非空方法的返回值::所有非getter/setter方法是由可以具有方法Interceptors分类处理

public static <T> T __intercept(AutoBean<?> bean, T returnValue) { 
    // Do stuff 
    return maybeAlteredReturnValue; 
}