EST-il possible d'utiliser l'API de réflexion java dans le client GWT? Je veux utiliser des réflexions pour trouver la valeur d'une propriété sur un Javabean. Est-ce possible?Pouvez-vous utiliser l'API Java Reflection dans le client GWT?
Répondre
Je suis là et la solution est en effet d'utilisation différée de reliure et de générateurs. Vous pouvez voir une utilisation de générateurs pour surmonter le manque de réflexion dans le client GWT ici:
http://jpereira.eu/2011/01/30/wheres-my-java-reflection/
Hope it helps.
Étant donné que le code GWT est traduit en Javascript, l'utilisation directe de l'API de réflexion n'est pas prise en charge.
Il existe un petit projet GWT-Reflection, qui permet d'utiliser la réflexion dans GWT.
Vous pouvez utiliser la fonctionnalité Générateurs GWT qui vous permet de générer du code pendant la phase de compilation GWT.
Votre haricot, que vous voulez introspect, peut étendre une classe qui a une méthode définie comme
public Object getProperty(String propertyName){}
Appelons cette classe IntrospectionBean
.
Disons que vous avez alors votre haricot défini comme:
public class MyBean extends IntrospectionBean {
private String prop1;
private String prop2;
}
Le générateur GWT aura accès à tous les domaines de MyBean et il peut générer la méthode getProperty(String propertyName)
lors de la compilation GWT, après itérer tous les champs de MyBean.
La classe générée pourrait ressembler à ceci:
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;
}
}
Vous pouvez utiliser simplement alors myBean.getProperty("prop1")
afin de récupérer une propriété en fonction de son nom lors de l'exécution.
Here vous pouvez trouver un exemple de la façon de mettre en oeuvre un générateur de GWT
Merci pour ça. Exactement ce dont j'avais besoin –
Si vous voulez simplement utiliser la réflexion pour récupérer un champ privé, pensez plutôt à utiliser jsni (interface natif javascript); il n'a aucune notion de public ou privé, de sorte que vous pouvez simplement saisir tout ce que vous voulez comme ceci:
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;
}-*/;
De plus, je suis au milieu de finition pour l'émulation java.lang.Class
newInstance
/réflexion.
Je posterai ici avec un lien dans environ deux jours si vous voulez jouer avec.
Il faut que vous passez une classe par une méthode que je voie à un générateur personnalisé (comme GWT.create
, sauf qu'il retourne un java.lang.Class généré avec accesseurs sur le terrain et la méthode qui pointent juste JSNI méthodes/champs. :)
Je me suis tout excité la première fois que j'ai vu cette réponse, mais en y regardant de plus près, il y a de sérieuses lacunes, comme le fait de devoir connaître le type de classe à l'avance par champ, au lieu de fournir le nom du champ. Peut-être aussi bien avoir un getter javabéen normal. – NickJ
... sauf si vous ne contrôlez pas le code auquel vous devez accéder et préférez ne pas conserver de copies du code de quelqu'un d'autre pour accéder aux membres privés. En outre, comment les génériques pourraient-ils aider à la réflexion? Les génériques fonctionnent par effacement, et jsni correspond à cela. – Ajax
Juste une autre pensée, vous pouvez générer tout cela. Je maintiens une version publique de GWT, net.wetheinter: gwt - *: 2.7.0 qui a une réflexion implémentée par injection de méthode magique. C'est un fork de Gwt car j'ai dû détourner le mécanisme de GWT.create pour trouver et remplacer la réflexion faite via les littéraux de classe/chaîne avec du code généré qui ressemble à l'exemple ci-dessus. Il y avait une version qui vous permettait d'améliorer une classe avec GWT.create pour éviter d'avoir à pirater le compilateur, mais il n'y avait pas assez d'intérêt pour le maintenir (cela a aussi généré des tonnes de code). – Ajax
J'ai rendu ma bibliothèque gwt-reflection publique.
https://github.com/WeTheInternet/xapi/tree/master/gwt/gwt-reflect https://github.com/WeTheInternet/gwt-sandbox/tree/xapi-gwt/user/src/com/google/gwt/reflect
En raison de problèmes de classpath à essayer de faire GWT choisir ma version de Class.java sur lui-même, je me suis finalement juste GWT fourchue, a ajouté java 8 et support de réflexion, et de maintenir maintenant net .wetheinter: GWT - *: qui a ce 2.7.0 soutien au four (je vais sortir un peu de temps après 2,8 GWT 2.8 va vivre)
Il prend en charge trois niveaux de réflexion:
monolithiques:
// Embeds all data needed to perform reflection into hidden fields of class
GwtReflect.magicClass(SomeClass.class);
SomeClass.getField(fieldName).set(null, 1);
léger:
// Allows direct reflection, provided ALL parameters are literals, or traced to literals
SomeClass.class.getField("FIELD_NAME").set(null, 1);
Flyweight:
// 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);
Ces exemples fonctionnent également des méthodes et Constructors. Il y a un support de base pour les annotations, et plus à venir dans le futur.
Projet intéressant. Remarque: avant de l'utiliser, assurez-vous de pouvoir accepter la licence GPL. –
Non ne peut pas utiliser cela à cause de la licence. De toute façon merci pour le pointeur –
Notez mes commentaires ci-dessous ... J'ai publié une mise en œuvre complète sous licence Apache de l'API de réflexion: https://github.com/WeTheInternet/xapi/tree/master/gwt/gwt-reflect – Ajax