MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Exécution de méthode avec comme nom une variable

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    7 Messages 3 Publieurs 1.4k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Benjamin LoisonB Hors-ligne
      Benjamin Loison
      dernière édition par

      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

      >! Développeur de Altis-Life (Arma III) sur Minecraft !
      >! Site web     : https://lemnoslife.com

      1 réponse Dernière réponse Répondre Citer 0
      • BrokenSwingB Hors-ligne
        BrokenSwing Moddeurs confirmés Rédacteurs
        dernière édition par

        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

        1 réponse Dernière réponse Répondre Citer 0
        • jglrxavpokJ Hors-ligne
          jglrxavpok Modérateurs
          dernière édition par

          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
          :::

          Modérateur sur MFF. 
          Mon Github: http://github.com/jglrxavpok
          Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

          1 réponse Dernière réponse Répondre Citer 0
          • BrokenSwingB Hors-ligne
            BrokenSwing Moddeurs confirmés Rédacteurs
            dernière édition par

            Et avec la méthode que j’ai donné, les fields public seulement sont accesibles (logique)

            1 réponse Dernière réponse Répondre Citer 0
            • jglrxavpokJ Hors-ligne
              jglrxavpok Modérateurs
              dernière édition par

              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.

              Modérateur sur MFF. 
              Mon Github: http://github.com/jglrxavpok
              Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

              1 réponse Dernière réponse Répondre Citer 0
              • Benjamin LoisonB Hors-ligne
                Benjamin Loison
                dernière édition par

                D’accord merci 🙂

                >! Développeur de Altis-Life (Arma III) sur Minecraft !
                >! Site web     : https://lemnoslife.com

                1 réponse Dernière réponse Répondre Citer 0
                • Benjamin LoisonB Hors-ligne
                  Benjamin Loison
                  dernière édition par

                  Réussi, il n’y a qu’à utiliser la réflexion, tapez sur Google, ce n’est pas très compliqué 🙂

                  >! Développeur de Altis-Life (Arma III) sur Minecraft !
                  >! Site web     : https://lemnoslife.com

                  1 réponse Dernière réponse Répondre Citer 0
                  • 1 / 1
                  • Premier message
                    Dernier message
                  Design by Woryk
                  ContactMentions Légales

                  MINECRAFT FORGE FRANCE © 2024

                  Powered by NodeBB