Question

Disons que je dois générer des variables pour tenir une entrée de l'utilisateur (je ne sais pas combien ils sont). Sans l'aide Array, ArrayList (et d'autres types de listes et cartes) peut générer mon code (permet de dire) les variables String X fois avec des noms tels que (String var001, String var002, String var003, etc.)? Si oui, s'il vous plaît fournir un exemple de code.

Était-ce utile?

La solution

Voici la façon dont je l'ai mis en œuvre et m'a aidé à réparer ma solution facilement sans obstacles beaucoup.

// Création de la liste de tableau

List accountList = new ArrayList(); 




for(int k=0;k < counter;k++){
        accountList.add(k, (String)flowCtx.getValueAt("transitId"+m));
}

itération de la boucle et en ajoutant les objets dans la liste de tableaux avec l'index.

// Récupération de l'objet au moment de l'exécution avec l'aide de l'indice

String a = accountList.get(i));

Autres conseils

Si vous vraiment veulent faire quelque chose comme ça, vous pouvez le faire par la génération de bytecode en utilisant ASM ou une autre bibliothèque.

Voici le code qui va générer une classe nommée « foo.bar.ClassWithFields » qui contient des champs « var0 » à « var99 ». Bien sûr, il n'y a pas d'autre moyen que la réflexion pour accéder à ces champs, parce qu'ils n'existent pas au moment de la compilation et Java est un langage typé statiquement.

import org.objectweb.asm.*;
import static org.objectweb.asm.Opcodes.*;

import java.lang.reflect.Field;

public class GeneratedFieldsExperiment {

    public static byte[] generateClassWithFields(int fieldCount) throws Exception {
        ClassWriter cw = new ClassWriter(0);
        FieldVisitor fv;
        MethodVisitor mv;
        AnnotationVisitor av0;

        cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "foo/bar/ClassWithFields", null, "java/lang/Object", null);

        for (int i = 0; i < fieldCount; i++) {
            fv = cw.visitField(ACC_PUBLIC, "var" + i, "Ljava/lang/String;", null, null);
            fv.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
            mv.visitInsn(RETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        cw.visitEnd();

        return cw.toByteArray();
    }

    public static void main(String[] args) throws Exception {
        MyClassLoader loader = new MyClassLoader();
        Class<?> c = loader.defineClass("foo.bar.ClassWithFields", generateClassWithFields(100));

        System.out.println(c);
        System.out.println("Fields:");
        for (Field field : c.getFields()) {
            System.out.println(field);
        }
    }

    private static class MyClassLoader extends ClassLoader {
        public Class<?> defineClass(String name, byte[] b) {
            return defineClass(name, b, 0, b.length);
        }
    }
}
  

Sans utiliser Array, ArrayList (et   d'autres types de listes et cartes)

Créer des fichiers avec ces noms. Espérons que cela fonctionnera pour votre professeur.

Ou utilisez l'API Java script mentionné précédemment:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");

engine.put("x", "hello"); // you can add any variable here
// print global variable "x"
engine.eval("println(x);");
// the above line prints "hello"

EDIT

On dirait en interne, cela utilisera :) Même avec carte fichier Propriétés, Préférences API ou DOM Les arbres (ils utilisent des vecteurs). Donc, si votre professeur est si pointilleux, utilisez les fichiers.

Je ne l'ai pas vu cela, je répondu encore, donc vais y aller. Ecrire un programme qui écrit à la sortie du code source Java. La majeure partie pourrait être un modèle, et vous devriez juste une boucle qui écrirait autant de variables de type « chaîne de UserString003 » que vous voulez.

Oui, cela est horrible. Mais, comme vous le dites, c'est un problème de défi conceptuel pour les devoirs, aussi longtemps que personne ne erreurs ce pour le code « bon », il pourrait résoudre le problème.

comme des variables Naming qui semble très 1980-ish. Signification objet pré programmation orientée. Donc, si vous construisez jamais un logiciel pour une vie -. NE PAS FAIRE

Mais comme il semble devoir ...

Quand nous parlons d'une variable nommée en Java, nous entendons quelque chose qui est compilé. Contrairement à certains langages de script, il n'y a aucun moyen facile de le faire en Java.

Donc, soit vous utilisez un moteur d'exécution classe compilée comme Markus Lausberg suggéré.
Ou vous tentez de tricher et d'utiliser l'API Java script et utiliser des langages de script. De cette façon, vous pouvez créer un code (dans une chaîne) lors de l'exécution.

Je pense que vous pouvez générer une classe Java lors de l'exécution ou utilisez peut-être un moteur de script comme Beanshell pour générer les variables, vous pouvez même construire la classe par son bytecode. Mais je ne vois pas comment vous utiliserez les variables dans votre code, vous devez créer le code pour travailler avec que les variables, ou utiliser la réflexion pour que ...

Une solution naïve:
créer une classe avec toutes les variables de var000 à var999 avec un getter pour chaque ... mais ce n'est pas vraiment dynamique!

Il semble que votre professeur est PHP biaisé sur la fonction ( Les variables dynamiques ), donc il pensait si cela était possible en java.

Personnellement, je ne pense pas que cela est possible, pas de la manière que vous proposez. Que peut-on faire est la génération de classes à l'exécution, en utilisant des outils tels que Javassist pour faire un mécanisme de réflexion plus puissant. Ainsi, vous pouvez créer une classe qui a les variables que vous voulez (chaîne1, chaîne2, etc.) lors de l'exécution.

Cependant, ne pas oublier que les variables dynamiques est une technique vraiment mauvais, ce qui conduit à mauvais code. Il pourrait être utile sur très peu de cas, mais je ne recommande vraiment pas.

Vous voulez dire que vous voulez générer des variables nommées

var0, var1, var2 et les utiliser dans votre code.

Quelle est la différence lorsque vous utilisez var [0], var [1], var [2], .....

et

Vous pouvez générer une classe Java dynamiquement lors de l'exécution qui implémente une interface que vous utilisez dans votre code normal. Ensuite, vous compilez cette classe en utilisant un compilateur (par exemple Janino), puis charger la classe lors de l'exécution. Que vous avez créé une classe dynamique.

Mais je me demande, si cela est nécessaire pour votre usecase.

EDIT

Je ne maintenant que USECASE vous utilisez ces paramètres, mais les arguments dynamiques que vous pouvez utiliser en Java comme ceci exemple d'ici

// calculate average
        public static double average( double... numbers )
        {
           double total = 0.0; // initialize total

          // calculate total using the enhanced for statement
          for ( double d : numbers )              
             total += d;                          

          return total / numbers.length;
       } // end method average

Ceci est impossible, mais c'est un candidat idéal pour l'utilisation de l'une des collections java.

Soit utiliser un réseau allouée dynamiquement:

String[] arr = new String[RUNTIME_SIZE];

Ou une liste qui peut changer sa taille lors de l'exécution:

List list = new ArrayList<String>();

Je ne sais pas si je vous ai bien compris, mais si vous essayez d'utiliser dynamiquement créés noms pour vos variables alors oui, sans aucun doute - je le fais comme ceci:

// rndRng() creates random numbers in specified range
// this would output dynamically created variable like "name89"
String myDynamicalyCreatedName = "name" + Utils.rndRng(0, 100);
final UberShader $myDynamicalyCreatedName = new UberShader();

Comme vous pouvez le voir sur la touche point ici est le signe « $ » qui dit essentiellement « créer nom de la variable de la chaîne qui est donné après ce signe », et est essentiellement cela - fonctionne comme un charme pour moi pendant quelques années maintenant ... espérons que c'est ce que vous vouliez et que cela aide un peu résoudre votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top