イントロスペクションGWT

エンリケから9月2日、2009 応答を残しなさい»

イントロ

GWTを使用するときに失われている機能の一つは、豆のイントロスペクションを実行するためにJavaの能力です。 この制限の理由は、GWTがないリフレクションAPIのエミュレーションを(java.lang.reflectに)持っていないということです。 この記事では、我々はGWTのイントロスペクションの種類を実装する方法が表示されます。 原理的にそれは些細なユーティリティではないので、我々はまた、イントロスペクションのいくつかのアプリケーションを検討します。

何のため?

私達が見る最初の事は我々がそれを望むものです。

我々は(ビジュアルコンポーネントのオブジェクトのプロパティを"フック"する機能)、データバインディングを持つビジュアルコンポーネントのフレームワークを開発するとします。 確かにCURD(ABMクレオール)を実装するの彼女の"すばらしい"仕事に触れた誰もがオブジェクトやその逆のビジュアルコンポーネントのセットを開始し、退屈な読書と会談した。 これをしなければならなかった場合、あなたは何か間違ったことをした :) よく、これは特にミス、コントロール- C + Ctrlキーを押しながらVになりやすいと退屈のような作業です。 我々のようなものを言うことができる場合:"このUIコンポーネントは、そのオブジェクトのなどのプロパティを見て、"その後、我々は、例えば同様にこの作業を軽減することができる我々はイベント処理のためにすべてのコードを保存する。

我々はこれを行うのであれば、我々は"見た目"だけでなく、コンポーネントの値の変更は自動的にBeanおよびその逆に反映されることを単にBeanおよびプロパティを設定するコンポーネントのセットを構築することができます。

しかし、イントロスペクションなしでこれを行う方法?

どのように? 何?!

我々はGWTで見たように(少なくとも1.7まで)は、反射がない、我々は選択肢がないので、しかし、イントロスペクションを実装する別の方法を見つけるために。 最初のJavaのイントロスペクションが何であるか見てみましょう。 JavaDocのjava.beans.Introspectorクラスによると:

"Introspectorクラスは、ツール、プロパティ、イベント、およびターゲットメソッドのJava Beanがサポートについて調べるための、標準的な方法を提供します。"

スペイン語で:

"Introspectorクラスは、Java Beanがサポートするプロパティ、イベントとメソッドを見つけるためのツールのための標準的な方法を提供します。"

私達に興味がある部分は、プロパティの一部です。 言い換えれば、我々はあなたがそれらのプロパティであり、これらの値がなんであるか尋ねるために、Java Beanのできるメカニズムを実装する。

フォームは、我々は洞察力を持つようにする各クラスのイントロスペクションのためのクラスを作成することによって、それを実装する予定です。

その後、クラスの:

 公共のクラスPerson {
    プライベート文字列名;
    プライベート文字列のアドレス;
    プライベート日付誕生。
    プライベートブール性別;

    公共の人(){
     }

    公共の文字列のgetName(){
        名前を返します。
     }
    公共ボイドのsetName(String name)を{
         this.name =名前;
     }

     / / getterおよびsetter ...詳細...
 } 

私たちは、"洞察"のようなものを実装する必要があります。

  {公共PersonaIntrospection
    民間人の人;

    公共PersonaIntrospeccion(){
     }

     GetPersonを公共の人(){
        人を返します。
     }

     setPersona公的人物(人物P){
        人= P;
     }

    公開リストのGetProperties <String>と(){
        リストL =新しいArrayListの<string>の<string>();
         l.add("名前");
         l.add("アドレス");
         l.add("誕生");
         l.add("性別");
     }

    公開オブジェクト、メソッドgetProperty(Stringプロパティ){
         ("名前が"。(プロパティ)に等しい)場合
             persona.getNombreリターン();
        他の場合("アドレス"。等しい(プロパティ))
             persona.getDireccionリターン();
        他の場合("誕生"。(プロパティ)に等しい)
             persona.getNacimientoリターン();
        他の場合("性別"。等しい(プロパティ))
             persona.getSexoリターン();
        
            新しいIllegalArgumentExceptionを(プロパティ)をスローします。
     }

    します。public void setPropertyを(Stringプロパティ、オブジェクトの値){
         ("名前が"。(プロパティ)に等しい)場合
             persona.setNombre((文字列)の値);
        他の場合("アドレス"。等しい(プロパティ))
             persona.setDireccion((文字列)の値);
        他の場合("誕生"。(プロパティ)に等しい)
             persona.setNacimiento((日)の値);
        他の場合("性別"。等しい(プロパティ))
             persona.setSexo((ブール)の値);
        
            新しいIllegalArgumentExceptionを(プロパティ)をスローします。
     }
 } 

あなたがコード(およびリストのキャッシュ)に作ることができる最適化を超えて、アイデアは、このクラスはpersonオブジェクトに私達に洞察を与える理由を理解することです。 想像されるように、恵みがクラスのPersonaIntrospectionを記述することされていません。 グレースは、物事つまらなくして、より"楽しい"物事に取り組んでいます :)

発電機を入力してください!

我々が行うことはGWTがPersonaIntrospectionクラスを生成することです。 どのように? 発電機を使用する。 これはGWTの非常に興味深い機能です。 この記事の焦点は、発電機を説明することである、インターネット上の多くの文献がある。 ここです ちょうど私達が何をするかを理解する専門家である必要はありません。

基本的に私たちはPersonの例で見たように、クラスXXXのXxxIntrospectionためのコードを生成するクラスを記述します。 Yは、(いくつかの外部ユーティリティを使用して、一種のコンパイルを作成するための任意のステップを作成せずに)私たちは、あなたがGWTコンパイラ(com.google.gwt.core.ext)を拡張するためのAPIを使用します。 注記:JavaのAPTを使用している人はほとんど類似点(表示されますhttp://java.sun.com/javase/6/docs/technotes/guides/apt/index.htmlを )。

GWTコンパイラーは、ステートメントのGWT.create(クラス) - クラスジェネレータは、クラス(この協会はモジュールgwt.xmlで宣言されている)に関連付けられたインターフェイスを呼び出すインタフェースの実装を返すに遭遇したとき。 このジェネレータは、インターフェイスクラスを実装するコードを"書き込み"です。 このコードを書き込むには、非常に連想させるcom.google.gwt.core.ext.typeinfo APIのJavaの反射ミラーであるAPIの援助を持っている。

生成

今ジェネレータどうか見てみましょう。 しかし、最初にそれが使用されているか見てみましょう。 GWT.create()インタフェースを受け取り、それの実装を返します。 その後、我々は、インタフェースのブランドを定義し、我々は、内省的と呼ぶことにします。 このインタフェースをされる実装するために持って行くイントロスペクションのサポートを追加したい任意の種類:

 introspectible {}パブリックインターフェイス 

その後、Personクラス:

 公共Personクラスには、{introspectible実装しています
     / / ... 属性とメソッド...
 } 

我々はまた、イントロスペクションのインターフェース言語を持っている必要があります。

 パブリックインターフェイスは<I Introspectable> {イントロスペクションを拡張
    私は)(getIntrospectable;
     setIntrospectableボイド(I I);
     <T> TメソッドgetProperty(String propNameプロパティ);
    ボイドsetPropertyを(文字列propNameプロパティ、オブジェクトの値);
     GetPropertyNameの<string>コレクション();
 } 

とイントロスペクションと使用するために:

 人の人=新しいPerson();
イントロスペクションの<person> GWT.createのインストロペ=(Persona.class);
 instrospection.setIntrospectable(人);

 {:(instrospection.getPropertyNames()文字列のプロップ)のための
     system.out.printlnを(支柱​​+"="+ instrospection.getProperty(プロップ));
 }

 Instrospection.getPropertyの文字列名=("名前");
 Instrospection.getProperty文字列のアドレス=("アドレス");
生年月日= instrospection.getProperty("誕生");
 Instrospection.getProperty性別=ブール("性別"); 

インタフェースジェネレータ内省を関連付けるには、次のスニペットを追加します。

 クラス="com.aquait.utils.gwt.rebind.IntrospectionGenerator"> <生成付き
    クラス="com.aquait.utils.gwt.introspection.Introspectable"/> <時型に割り当て可能
 </生成 - で> 

そうGWTコンパイラはGWT.create(Persona.class)のとき、クラスPersonは、内省的な実装のために発電機と呼ばれる。 その後、我々は、Personクラスのイントロスペクションのインタフェースの実装を持っている。

プロジェクトで使用するために、<module>のにこれを追加Gwt.xml。

 名前="com.aquait.utils.gwt.Introspection"/> <継承 

GWTのモジュールはここでダウンロードできます。 introspection4gwt

EDIT:小さなバグが原因でファイルを更新した。

EDIT:アカウントにスーパークラスのプロパティを利用していないバグのために再度更新。

ブロガーポスト Diggの のreddit Googleリーダー シェア
広告

コメントを残す

キャプチャ-無料WPによるスパム防御