Domanda

Diciamo che ho bisogno di generare variabili per contenere alcuni input da parte dell'utente (non so quanti sono). Senza usare Array, ArrayList (e altri tipi di elenchi e mappe) può generare il mio codice (diciamo) String variabili x volte con nomi come (String var001, String var002, String var003, ecc)? Se sì, si prega di fornire il codice di esempio.

È stato utile?

Soluzione

Di seguito è riportato il modo in cui ho implementato e mi ha aiutato a risolvere il mio soluzione facilmente senza molto ostacoli.

// Creazione della lista di array

List accountList = new ArrayList(); 




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

Iterando il ciclo e aggiungendo gli oggetti nel arraylist con l'indice.

// Recupero dell'oggetto in fase di esecuzione con l'aiuto dell'indice

String a = accountList.get(i));

Altri suggerimenti

Se davvero vuole fare una cosa del genere, è possibile farlo attraverso la generazione di bytecode utilizzando ASM o qualche altra libreria.

Ecco il codice che genera una classe denominata "foo.bar.ClassWithFields", che contiene i campi "Var0" a "var99". Naturalmente non esiste un modo diverso di riflessione per accedere a tali campi, perché non esistono al momento della compilazione e Java è un linguaggio a tipizzazione statica.

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);
        }
    }
}
  

Senza usare Array, ArrayList (e   altri tipi di liste e mappe)

Crea file con questi nomi. Spero che funzionerà per il vostro professore.

In alternativa, utilizzare l'API Java Script accennato prima:

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"

Modifica

Sembra che internamente questo utilizzerà mappe :) stesso con file di Proprietà, Preferenze API, o DOM Alberi (che stanno utilizzando vettori). Così, se il professore è così pignolo, utilizzare i file.

Non ho visto questo ha risposto ancora, quindi mi andare per esso. Scrivere un programma che scrive appena uscito codice sorgente di Java. La maggior parte di esso potrebbe essere un modello, e si sarebbe solo avere un ciclo che avrebbe scrivere come molte variabili di tipo "stringa" UserString003 come si desidera.

Sì, questo è orribile. Ma, come hai detto, si tratta di un problema concettuale sfida per i compiti, così finché nessun errori uno questo per codice "buono", si potrebbe risolvere il problema.

variabili di denominazione del genere sembra molto 1980-ish. Significato pre programmazione orientata agli oggetti. Quindi, se mai a costruire un software per una vita -. NON FARE QUESTO

Ma dal momento che sembra essere i compiti ...

Quando stiamo parlando di una variabile denominata in Java, intendiamo qualcosa che è compilato. A differenza di alcuni linguaggi di scripting non v'è alcun modo semplice per fare questo in Java.

Quindi, o si utilizza una classe compilata runtime come Markus Lausberg suggerito.
Oppure si bari usando l'API Java Script e fare uso dei linguaggi di scripting. In questo modo è possibile creare codice (in una stringa) in fase di esecuzione.

Penso che si possa generare una classe Java in fase di esecuzione o forse usare qualche motore di script come Beanshell per generare le variabili, si può anche costruire la classe dalla sua bytecode. Ma non riesco a vedere come si intende utilizzare che le variabili nel codice, è necessario anche creare il codice per lavorare con che le variabili, o utilizzare la riflessione per quello ...

Una soluzione ingenua:
creare una classe con tutte le variabili da var000 a var999 con un getter per ogni ... ma che non è proprio in modo dinamico!

Sembra che il tuo professore è PHP-parziale la funzione ( variabili variabili ), così stava pensando se fosse possibile in Java.

Io personalmente non credo che ciò sia possibile, non nel modo in cui lei propone. Cosa si può fare è la generazione di classi in fase di runtime, utilizzando strumenti come Javassist per fare un più potente meccanismo di riflessione. Così si può creare una classe che ha le variabili che si desidera (stringa1, stringa2, ecc) in fase di esecuzione.

Tuttavia, non dimenticate che le variabili variabili è una pessima tecnica, che porta a codice cattivo. Potrebbe essere utile in pochissimi casi, ma io davvero non lo consiglio.

Vuoi dire che si desidera generare variabili denominate

Var0, var1, var2 e utilizzarli nel codice.

Qual è la differenza quando si utilizza var [0], var [1], var [2], .....

MA

È possibile generare una classe Java dinamicamente in fase di esecuzione, che implementa un'interfaccia che si sta utilizzando nel codice normale. Poi si compila questa classe utilizzando un compilatore (ad esempio Janino) e quindi caricare la classe in fase di esecuzione. Di quello che hai creato una classe in modo dinamico.

Ma mi chiedo, se questo è necessario per il vostro caso d'uso.

Modifica

I dont ora che caso d'uso che si sta utilizzando questi parametri, ma argomenti dinamici è possibile utilizzare in Java come questo esempio da qui

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

Questo non è possibile, ma questo è un candidato perfetto per l'utilizzo di una delle collezioni di Java.

Utilizzare un array allocato dinamicamente:

String[] arr = new String[RUNTIME_SIZE];

o una lista che può cambiare la sua dimensione durante il runtime:

List list = new ArrayList<String>();

Non so se ho capito bene, ma se si sta tentando di utilizzare nomi creati in modo dinamico per le variabili allora sì, sicuramente - sto facendo in questo modo:

// 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();

Come si può vedere il punto chiave qui è il segno "$" che in pratica dice "creare nome di variabile dalla stringa che viene dato dopo questo segno", e questo è fondamentalmente - funziona come un fascino per me per alcuni anni ora ... spero che sia quello che volevi e che aiuta un po 'risolvere il tuo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top