Pregunta

Digamos que necesito para generar variables para contener alguna entrada del usuario (no sé cuántos son). Sin utilizar Array, ArrayList (y otro tipo de listas y mapas) puede generar el código (digamos) String variables X veces con nombres como (String var001, String var002, String var003, etc)? En caso afirmativo, proporcionar el código de muestra.

¿Fue útil?

Solución

A continuación se muestra la forma en que he implementado y me ayudó a arreglar mi solución fácilmente sin mucho obstáculos.

// Creación de la lista array

List accountList = new ArrayList(); 




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

iteración del bucle y la adición de los objetos en el ArrayList con el índice.

// Recuperar el objeto en tiempo de ejecución con la ayuda del índice

String a = accountList.get(i));

Otros consejos

Si realmente quieren hacer algo por el estilo, puede hacerlo a través de la generación de código de bytes utilizando ASM o alguna otra biblioteca.

Aquí está el código que va a generar una clase llamada "foo.bar.ClassWithFields" que contiene campos "var0" a "var99". Por supuesto no hay manera distinta de reflexión para acceder a esos campos, debido a que no existen en tiempo de compilación y Java es un lenguaje de tipos estáticos.

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

Sin utilizar Array, ArrayList (y   otro tipo de listas y mapas)

Crear archivos con estos nombres. La esperanza de que va a trabajar para su profesor.

O utilizar la API de Java de secuencias de comandos se mencionó antes:

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"

Editar

Parece que internamente esta utilizará Mapas :) Lo mismo con el archivo Propiedades, Preferencias API, o DOM árboles (que están usando vectores). Así que si su profesor es tan exigente, utilizar los archivos.

No he visto este contestado todavía, así que voy a ir a por ello. Escribir un programa que acaba de salir, escribe el código fuente de Java. La mayor parte de ella podría ser una plantilla, y sólo tendría un bucle que escribir tantas variables de tipo "string" UserString003 como desee.

Sí, esto es horrible. Pero, como usted ha dicho, se trata de un problema desafío conceptual para hacer la tarea, por lo que, siempre que no haya errores de uno esta "buena" código, se podría resolver el problema.

variables de asignación de nombres como el que se ve muy 1980-ish. Significado programación orientada a objetos previamente. Así que si alguna vez se construye software para la vida -. NO HACER ESTO

Sin embargo, ya que parece ser la tarea ...

Cuando estamos hablando de una variable llamada en Java, nos referimos a algo que ha compilado. A diferencia de algunos lenguajes de script no hay manera fácil de hacer esto en Java.

Así que, o se utiliza una clase compilada tiempo de ejecución como Markus Lausberg sugeridos.
O haces trampa y utilizar la API de Java Scripting y hacer uso de los lenguajes de script. De esa manera se puede crear un código (en una cadena) en tiempo de ejecución.

Creo que se puede generar una clase de Java en tiempo de ejecución o tal vez usar algún motor de secuencia de comandos como Beanshell para generar las variables, incluso se puede construir la clase por su código de bytes. Pero no puedo ver cómo va a utilizar que las variables en su código, también debe crear el código para trabajar con que las variables, o utilizar la reflexión para que ...

Una solución ingenua:
crear una clase con todas las variables de var000 a var999 con un captador para cada uno ... pero eso no es realmente dinámica!

Parece que tu profesor es PHP-sesgada de la característica ( variables variables ), por lo que estaba pensando si eso era posible en java.

Yo personalmente no creo que esto es posible, no en la forma que usted propone. Lo que puede hacerse es la generación de clases en tiempo de ejecución, utilizando herramientas como Javassist para hacer una más potente mecanismo de reflexión. Por lo que puede crear una clase que tiene las variables que desee (cadena1, cadena2, etc.) en tiempo de ejecución.

Sin embargo, no se olvide que Variables variables es una técnica muy mal, lo que conduce a un mal código. Podría ser útil en muy pocos casos, pero realmente no lo recomiendo.

¿Quiere decir que desea generar variables con nombre

var0, var1, var2 y utilizarlos en su código.

¿Cuál es la diferencia cuando se utiliza var [0], var [1], var [2], .....

y

Se puede generar una clase Java de forma dinámica en tiempo de ejecución que implementa una interfaz que está utilizando en su código normal. A continuación, se compila esta clase mediante un compilador (Por ejemplo Janino) y luego cargar la clase en tiempo de ejecución. De lo que han creado una clase dinámica.

Pero me pregunto, si esto es necesario para su caso de uso.

Editar

i no para los que ahora USECASE está utilizando estos parámetros, pero los argumentos dinámicos puede utilizar en Java como éste ejemplo de aquí

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

Esto no es posible, pero esto es un candidato perfecto para el uso de una de las colecciones de Java.

O bien utilizar una matriz asignada dinámicamente:

String[] arr = new String[RUNTIME_SIZE];

o una lista que puede cambiar su tamaño en tiempo de ejecución:

List list = new ArrayList<String>();

No sé si he entendido bien, pero si usted está tratando de utilizar nombres creados de forma dinámica para las variables, entonces sí, definitivamente - lo estoy haciendo de esta manera:

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

Como se puede ver el punto clave aquí es el signo "$" que básicamente dice "crear nombre de la variable de la cadena que se da después de este signo", y eso es básicamente - funciona como un encanto para mí durante algunos años ahora ... espero que sea lo que quería y que ayuda un poco para resolver su problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top