Résolu Exécution de méthode avec comme nom une variable
-
Mon problème est compliqué à expliqué, c’est avec le Java en général…
Par exemple :
public String get(String info)
Et j’aimerais que ça return this.info seulement je veux pas avoir le String info qu’il y a dans cette classe mais je veux que ça prenne la valeur this.test si j’ai fais get(“test”);
J’espère avoir été compris, et le plus clair en espérant des retours ambitieux :S
-
Passe par un switch ou plusieurs if
Ou par reflection :public String get(String name) { Object obj = this.getClass().getField(name).get(this); if(obj instanceof String) return (String)obj; return null; }
J’ai enlevé les try/catch mais faut que tu retourne null à chaque catch
-
Faut faire attention, la réflection peut être lente, les MethodHandle sont plus rapides: https://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html
Cependant, la moindre erreur sur les arguments ou les types et ça plante.:::
J’ai pas trop le temps pour développer donc voici un exemple dans un de mes projets: https://github.com/jglrxavpok/Thoth/blob/master/src/main/java/thoth/lang/TranslationSet.java
::: -
Et avec la méthode que j’ai donné, les fields public seulement sont accesibles (logique)
-
Il est possible de forcer l’accès aux membres non public avec
AccessibleObject::setAccessible(boolean)
Cependant il est possible que le jeu plante selon le niveau de sécurité de la JVM (pas un problème sur Minecraft si on a rien bidouillé pour ça)
Avec ma méthode aussi il est possible de forcer l’accès aux membres non public avec
MethodHandles.loopup()
ATTENTION! Il faut être très vigilant avec ceci, ça peut générer des problèmes de sécurité si on le laisse trainer (ça voudrait dire que n’importe quel code pourrait exécuter n’importe quoi)
En passant, j’aurais du faire plus attention mais MethodHandle (comme son nom l’indique) ne s’applique qu’à des méthodes et non des fields. On peut facilement contourner le problème en créant un getter pour ce field.
-
D’accord merci
-
Réussi, il n’y a qu’à utiliser la réflexion, tapez sur Google, ce n’est pas très compliqué