Там находится далеко для генерации имен Переменных динамично в Java?

Если Вы знаете название файла, и Вы хотите контролировать только один (или несколько файлов), можно просто назвать "фиксацию мерзавца" каждыми несколькими минутами для достижения этого. Если файл не изменился, мерзавец будет просто жаловаться, и необходимо будет проигнорировать эту ошибку, но кроме который, не будет никакого повреждения.

, В дополнение к которому, Вы захотите отметить эти файлы как "автоматическую фиксацию", чтобы быть в состоянии фиксировать вручную также. Таким образом, пользователь видит автоматические изменения и также большие "логические" изменения, которые сопровождаются комментариями фиксации, чтобы объяснить, что это изменилось начиная с последней ручной фиксации.

, Например, используйте "АВТОМАТИЧЕСКУЮ ФИКСАЦИЮ" в качестве сообщения о фиксации. Позже, можно записать инструмент для чистки этих фиксаций с помощью журнала мерзавца (для обнаружения изменений для уничтожения), или можно попытаться создать АВТОМАТИЧЕСКУЮ ФИКСАЦИЮ ответвления использовать стратегию твердости коллизии грубой силы стучать в "ручных фиксациях".

Другая опция состоит в том, чтобы использовать низкоуровневые команды мерзавца для создания собственного специализированного репозитория.

Наконец, Вы могли скопировать файл в новое имя (" $filename.ac") при выполнении автоматических фиксаций для различения ручные и автоматические версии.

5
задан Mike 30 November 2012 в 14:25
поделиться

8 ответов

Если вы действительно хотите сделать что-то подобное, вы можете сделать это с помощью генерации байт-кода с помощью ASM или другого библиотека.

Вот код, который будет генерировать класс с именем «foo.bar.ClassWithFields», который содержит поля от «var0» до «var99». Конечно, нет другого способа, кроме отражения, получить доступ к этим полям, потому что они не существуют во время компиляции, а Java является статически типизированным языком.

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);
        }
    }
}
5
ответ дан 18 December 2019 в 06:51
поделиться

Без использования Array, ArrayList (и другие виды списков и карт)

Создайте файлы с этими именами. Надеюсь, это сработает для вашего профессора.

Или используйте API сценариев Java, упомянутый ранее:

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"

РЕДАКТИРОВАТЬ

Похоже, внутри будут использоваться Карты :) То же самое с файлом свойств, API предпочтений или деревьями DOM (они используют векторы). Так что, если ваш профессор такой разборчивый, используйте файлы.

4
ответ дан 18 December 2019 в 06:51
поделиться

Такое именование переменных выглядит очень похоже на 1980-е годы. Значение до объектно-ориентированного программирования. Так что если вы когда-нибудь создадите программное обеспечение для жизни - НЕ ДЕЛАЙТЕ ЭТО.

Но поскольку это кажется домашним заданием ...

Когда мы говорим об именованной переменной в Java, мы имеем в виду то, что скомпилировано. В отличие от некоторых языков сценариев, в Java нет простого способа сделать это.

Так что либо вы используете класс, скомпилированный во время выполнения, как предложил Маркус Лаусберг.
Или вы обманываете и используете Java Scripting API и используете языки сценариев. Таким образом, вы можете создавать код (в виде строки) во время выполнения.

2
ответ дан 18 December 2019 в 06:51
поделиться

Я еще не видел ответа на этот вопрос, поэтому я сделаю это. Напишите программу, которая просто записывает исходный код Java. По большей части это может быть шаблон, и у вас будет просто цикл, который будет записывать столько переменных типа "string UserString003", сколько вы хотите.

Да, это ужасно. Но, как вы сказали, это концептуальная проблема для домашнего задания,

3
ответ дан 18 December 2019 в 06:51
поделиться

Я думаю, что вы можете сгенерировать класс Java во время выполнения или, возможно, использовать какой-нибудь скриптовый движок, например Beanshell , для генерации переменных, вы даже можете построить класс по его байт-коду. Но я не понимаю, как вы будете использовать эти переменные в своем коде, вы также должны создать код для работы с этими переменными или использовать для этого отражение ...

Наивное решение:
создайте класс со всеми переменными от var000 до var999 с геттером для каждой ... но это не совсем динамично!

2
ответ дан 18 December 2019 в 06:51
поделиться

Похоже, ваш профессор предпочитает PHP ( Переменные переменные ), поэтому он думал, возможно ли это в java.

Я лично не знаю Не думаю, что это возможно, не так, как вы предлагаете. Что можно сделать, так это создать классы во время выполнения, используя такие инструменты, как Javassist , чтобы создать более мощный механизм отражения. Таким образом, вы можете создать класс с нужными вам переменными (строка1, строка2 и т. Д.) Во время выполнения.

Однако не забывайте, что Переменные переменные - действительно плохой метод, который приводит к плохой код. Это может быть полезно в очень немногих случаях, но я действительно не рекомендую его.

2
ответ дан 18 December 2019 в 06:51
поделиться

Вы имеете в виду, что хотите сгенерировать переменные с именем

var0, var1, var2 и использовать их в своем коде.

В чем разница, когда вы используете var [0], var [1], var [2], .....

НО

Вы можете генерировать класс Java динамически во время выполнения, который реализует интерфейс, который вы используете в своем обычном коде. Затем вы компилируете этот класс с помощью компилятора (например, Janino), а затем загружаете класс во время выполнения. Затем вы создали класс динамически.

Но мне интересно, необходимо ли это для вашего варианта использования.

РЕДАКТИРОВАТЬ

Я не знаю, для какого варианта использования вы используете эти параметры, но динамические аргументы вы можете использовать в Java, например этот пример отсюда

// 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
2
ответ дан 18 December 2019 в 06:51
поделиться

Это невозможно, но это идеальный кандидат для использования одной из коллекций Java.

Либо используйте динамически выделяемый массив:

String[] arr = new String[RUNTIME_SIZE];

Или список, который может изменять свой размер во время выполнения:

List list = new ArrayList<String>();
1
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: