2011-06-08 61 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; 
}