Introspection GWT

2. September 2009 von Enrique Leave a reply »

Intro

Eines der Features, verpasste bei der Verwendung von GWT sind, ist Java die Fähigkeit der Selbstbeobachtung auf Bohnen durchzuführen. Der Grund für diese Einschränkung ist, dass GWT keine Reflection-API-Emulation (java.lang.reflect) hat. In diesem Artikel werden wir sehen, wie wir eine Art Introspektion in GWT zu implementieren. Wir werden auch untersuchen, einige Anwendungen der Introspektion, da im Prinzip ist es nicht trivial Dienstprogramm.

Wofür?

Das erste, was wir sehen, ist das, was wir wollen.

Angenommen, wir wollen einen Rahmen für die visuelle Komponenten, die Datenbindung (Fähigkeit, "Haken" die Eigenschaft eines Objekts, um eine visuelle Komponente) haben zu entwickeln. Sicherlich niemand, der sie "wunderbar" Job der Implementierung eines Quark (ABM Creole) berührt wurde mit Satz ab und mühsame Lektüre der visuellen Komponenten des Objekts und umgekehrt erfüllt. Wenn Sie dies tun hatte, hast du etwas falsch :) . Nun, dies ist eine Aufgabe, so langweilig, wie fehleranfällig, insbesondere Control-C + Strg-V. Wenn wir so etwas wie sagen konnte: "Das UI-Komponente befasst sich mit den Eigenschaften des Objekts," dann können wir lindern diese Aufgabe sowie zum Beispiel sparen wir den gesamten Code für die Ereignisbehandlung.

Also, wenn wir dies tun, können wir eine Reihe von Komponenten, auf die wir setzen einfach die Bohne und die Eigenschaft, dass "Blick" sowie die Komponente Wert ändert sich automatisch in der Bohne und umgekehrt werden.

Aber wie kann man dies ohne Introspektion zu tun?

Wie? Was?!

Wie wir in GWT (zumindest bis 1,7) sah es gibt keine Reflexion, so haben wir keine andere Wahl als eine weitere Möglichkeit, Introspektion zu implementieren. Lassen Sie uns zunächst sehen, was Introspektion in Java. Nach Angaben der JavaDoc java.beans.Introspector Klasse:

"Die Introspector Klasse stellt einen Standard für Werkzeuge, um über die Eigenschaften, Ereignisse und unterstützt von einem Ziel Methods Java Bean lernen."

In Spanisch:

"Die Introspector Klasse stellt einen Standard für Werkzeuge, Eigenschaften, Ereignisse und Methoden durch ein Java Bean unterstützt zu entdecken."

Der Teil, der uns interessiert ist der Teil des Grundstücks. Mit anderen Worten, wir wollen einen Mechanismus, mit dem Sie eine Java Bean werden können, um zu fragen, was sind ihre Eigenschaften und was sind die Werte dieser zu implementieren.

Die Form wird es durch die Schaffung einer Klasse für jede Klasse Introspektion wollen wir Einblick haben, umzusetzen.

Dann für die Klasse:

  public class Person {
     private String name;
     private String-Adresse;
     Private Date Geburt;
     private boolean Geschlecht;

     öffentliche Person () {
     }

     public String getName () {
         return name;
     }
     public void setName (String name) {
         this.name = name;
     }

     / / Getter und Setter ... mehr ...
 } 

Wir müssen die Art der "Einsicht" zu implementieren:

  {Public PersonaIntrospection
     private Person Person;

     öffentlichen PersonaIntrospeccion () {
     }

     GetPerson öffentlichen Person () {
         Rückkehr Person;
     }

     setPersona öffentlichen Person (Person p) {
         person = p;
     }

     public List getProperties <String> () {
         Liste l = new ArrayList <String> <String> ();
         l.add ("name");
         l.add ("Adresse");
         l.add ("Geburt");
         l.add ("sex");
     }

     public Object getProperty (String-Eigenschaft) {
         if ("name". equals (Eigentum))
             persona.getNombre return ();
         else if ("Adresse". equals (Eigentum))
             persona.getDireccion return ();
         else if ("Geburt". equals (Eigentum))
             persona.getNacimiento return ();
         else if ("sex". equals (Eigentum))
             persona.getSexo return ();
         sonst
             throw new IllegalArgumentException (Immobilien);
     }

     public void setProperty (String-Eigenschaft, Object value) {
         if ("name". equals (Eigentum))
             persona.setNombre ((String) value);
         else if ("Adresse". equals (Eigentum))
             persona.setDireccion ((String) value);
         else if ("Geburt". equals (Eigentum))
             persona.setNacimiento ((Datum)-Wert);
         else if ("sex". equals (Eigentum))
             persona.setSexo ((Boolean)-Wert);
         sonst
             throw new IllegalArgumentException (Immobilien);
     }
 } 

Über die Optimierungen, die Sie den Code (und Listen-Cache) machen kann, ist die Idee zu verstehen, warum dieser Klasse gibt uns Einblick in eine Person Objekt. Als sein vorstellen sollte, ist die Gnade nicht mit der Klasse PersonaIntrospection schreiben. Grace ist auf die Dinge, die weniger langweilig und mehr "fun" Dinge :)

Geben Generatoren!

Was wir tun, ist, dass GWT PersonaIntrospection Klasse generiert. Wie? Generatoren verwenden. Dies ist ein sehr interessantes Feature von GWT. Der Schwerpunkt dieses Artikels ist es, Generatoren zu erklären, gibt es viel Literatur über das Internet. Hier ist eine Nur nicht ein Experte zu verstehen, was wir tun werden.

Grundsätzlich schreiben wir eine Klasse, die Code für die Klasse Xxx XxxIntrospection wie wir am Beispiel der Person sah. Y (um zu vermeiden, jeder Schritt zur Schaffung der Art Compilation mit einigen externen Dienstprogramm zu machen), werden wir die API mit dem Sie die GWT-Compiler (com.google.gwt.core.ext) erweitern können. Hinweis: Diejenigen, die Java APT verwendet haben, werden ein paar Ähnlichkeiten (siehe http://java.sun.com/javase/6/docs/technotes/guides/apt/index.html ).

Wenn der GWT-Compiler die Anweisung GWT.create (Klasse)-die eine Schnittstelle Implementierungsklasse-Generator ruft die Schnittstelle mit der Klasse (dieses Vereins ist in das Modul gwt.xml erklärt) verbunden kehrt Begegnungen. Dieser Generator ist "Schreiben" der Code, der die Schnittstelle implementiert wird. So schreiben Sie diesen Code haben die Hilfe der API, erinnert sehr an com.google.gwt.core.ext.typeinfo API Java Reflection Spiegel ist.

Erzeugen

Nun wollen wir sehen, wenn der Generator. Aber zuerst wollen wir mal sehen, wie es benutzt wird. GWT.create () nimmt eine Schnittstelle und gibt eine Einführung von IT. Dann definieren wir ein Interface-Marke und wir rufen introspektiv. Jede Art die Sie unterstützen wollen der Introspektion zu haben, um diese Schnittstelle zu implementieren sind:

 introspectible {} public interface 

Dann wird die Klasse Person:

  public class Person {implementiert introspectible
     / / ...  Attribute und Methoden ...
 } 

Wir müssen auch die Sprache der Benutzeroberfläche der Introspektion haben:

  öffentliche Schnittstelle erweitert <I Introspectable> {Introspection
     Ich getIntrospectable ();
     setIntrospectable void (I i);
     <T> T getProperty (String propName);
     void setProperty (String propName, Object value);
     GetPropertyName <String> Collection ();
 } 

Und für Introspektion und verwenden:

  Person = new Person ();
 Introspection <person> GWT.create instrospection = (Persona.class);
 instrospection.setIntrospectable (Person);

 for (String prop: instrospection.getPropertyNames ()) {
     System.out.println (prop + "=" + instrospection.getProperty (prop));
 }

 Instrospection.getProperty String name = ("name");
 Instrospection.getProperty String address = ("Adresse");
 Datum der Geburt = instrospection.getProperty ("Geburt");
 Instrospection.getProperty sex = Boolean ("sex"); 

So verknüpfen Sie die Schnittstelle Generator introspektive, zu ergänzen, der folgenden Ausschnitt:

  class = "com.aquait.utils.gwt.rebind.IntrospectionGenerator"> <generate-mit
     class = "com.aquait.utils.gwt.introspection.Introspectable" /> <bei Typ-zuweisbare
 </ Generate-mit> 

Also, wenn die GWT-Compiler GWT.create (Persona.class) ist, die so genannte Generator für die Klasse Person introspektiven implementiert. Dann haben wir eine Introspection Interface-Implementierung für die Klasse Person.

Für den Einsatz in einem Projekt, fügen Sie diese in der <module> Gwt.xml.:

  name = "com.aquait.utils.gwt.Introspection" /> <erbt 

Die GWT-Modul kann hier heruntergeladen werden: introspection4gwt

EDIT: aktualisiert die Datei wegen eines kleinen Fehlers.

EDIT: wieder aufgrund eines Fehlers nicht berücksichtigt haben nehmen Sie die Eigenschaften der Oberklassen aktualisiert.

Blogger Beitrag Digg Reddit Google Reader Anteil
Anzeige

Hinterlasse einen Kommentar

Spam Schutz durch WP Captcha-freie