GWTクライアント側でJavaリフレクションAPIを使用することは可能ですか?リフレクションを使用してJavabeanのプロパティの値を検索したいのですが、これは可能ですか?
私はそこに行ったことがありますが、解決策は確かに遅延バインディングとジェネレーターを使用することです。ここで、GWTクライアントのReflectionの欠如を克服するためのジェネレーターの使用を見ることができます。
http://jpereira.eu/2011/01/30/wheres-my-Java-reflection/
それが役に立てば幸い。
GWTのコンパイル段階でコードを生成できるGWTジェネレーター機能を使用できます。
イントロスペクトしたいBeanは、次のように定義されたメソッドを持つクラスを拡張できます。
_public Object getProperty(String propertyName){}
_
このクラスをIntrospectionBean
と呼びましょう。
次に、Beanを次のように定義するとします。
_public class MyBean extends IntrospectionBean {
private String prop1;
private String prop2;
}
_
GWTジェネレーターはMyBeanのすべてのフィールドにアクセスでき、MyBeanのすべてのフィールドを反復処理した後、GWTのコンパイル時にgetProperty(String propertyName)
メソッドを生成できます。
生成されたクラスは次のようになります。
_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")
を使用して、実行時にその名前に基づいてプロパティを取得できます。
ここ gwtジェネレーターを実装する方法の例を見つけることができます
GWTコードはJavascriptに変換されるため、リフレクションAPIの直接使用はサポートされていません。
小さなプロジェクトがあります GWT-Reflection 、GWTでリフレクションを使用できるようにします。
GWTはリフレクションを完全にはサポートしていません。以下のリンクをご覧ください。
http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsCompatibility.html
Javaとjavascriptの境界に注意する必要があります。GWTでは、すべてのコードがjavascriptにコンパイルされるため、JavaScriptが明確に定義されたリフレクションであるかどうかを確認する必要があります。
Gwt-reflectionライブラリを公開しました。
https://github.com/WeTheInternet/xapi/tree/master/gwt/gwt-reflecthttps://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をリリースします)
次の3つのレベルの反射をサポートします。
モノリシック:
// 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);
これらの例は、メソッドとコンストラクターでも機能します。アノテーションの基本的なサポートがあり、将来的にはさらに多くのサポートがあります。
リフレクションを使用してプライベートフィールドを取得するだけの場合は、代わりにjsni(javascriptネイティブインターフェイス)の使用を検討してください。プライベートまたはパブリックの概念がないので、好きなものを何でも手に入れることができます。
package com.foo;
class SomeClass {
private String someField;
private static int someInt;
}
//accessors:
native String ripField(SomeClass from)
/*-{
return [email protected]::someField;
}-*/;
native int ripInt()
/*-{
return @com.foo.SomeClass::someInt;
}-*/;
また、Java.lang.Class
newInstance
/リフレクションのエミュレーションを終了している最中です。
遊びたい場合は、2日ほどでリンクを貼ってここに投稿します。
カスタムジェネレーター(GWT.create
など)にルーティングするメソッドを介してクラスを渡す必要があります。ただし、jsniメソッド/フィールドを指すフィールドとメソッドアクセサーを持つ生成されたJava.lang.Classが返されます。 )