Если Вы знаете название файла, и Вы хотите контролировать только один (или несколько файлов), можно просто назвать "фиксацию мерзавца" каждыми несколькими минутами для достижения этого. Если файл не изменился, мерзавец будет просто жаловаться, и необходимо будет проигнорировать эту ошибку, но кроме который, не будет никакого повреждения.
, В дополнение к которому, Вы захотите отметить эти файлы как "автоматическую фиксацию", чтобы быть в состоянии фиксировать вручную также. Таким образом, пользователь видит автоматические изменения и также большие "логические" изменения, которые сопровождаются комментариями фиксации, чтобы объяснить, что это изменилось начиная с последней ручной фиксации.
, Например, используйте "АВТОМАТИЧЕСКУЮ ФИКСАЦИЮ" в качестве сообщения о фиксации. Позже, можно записать инструмент для чистки этих фиксаций с помощью журнала мерзавца (для обнаружения изменений для уничтожения), или можно попытаться создать АВТОМАТИЧЕСКУЮ ФИКСАЦИЮ ответвления использовать стратегию твердости коллизии грубой силы стучать в "ручных фиксациях".
Другая опция состоит в том, чтобы использовать низкоуровневые команды мерзавца для создания собственного специализированного репозитория.
Наконец, Вы могли скопировать файл в новое имя (" $filename.ac") при выполнении автоматических фиксаций для различения ручные и автоматические версии.
Если вы действительно хотите сделать что-то подобное, вы можете сделать это с помощью генерации байт-кода с помощью 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);
}
}
}
Без использования 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 (они используют векторы). Так что, если ваш профессор такой разборчивый, используйте файлы.
Такое именование переменных выглядит очень похоже на 1980-е годы. Значение до объектно-ориентированного программирования. Так что если вы когда-нибудь создадите программное обеспечение для жизни - НЕ ДЕЛАЙТЕ ЭТО.
Но поскольку это кажется домашним заданием ...
Когда мы говорим об именованной переменной в Java, мы имеем в виду то, что скомпилировано. В отличие от некоторых языков сценариев, в Java нет простого способа сделать это.
Так что либо вы используете класс, скомпилированный во время выполнения, как предложил Маркус Лаусберг.
Или вы обманываете и используете Java Scripting API и используете языки сценариев. Таким образом, вы можете создавать код (в виде строки) во время выполнения.
Я еще не видел ответа на этот вопрос, поэтому я сделаю это. Напишите программу, которая просто записывает исходный код Java. По большей части это может быть шаблон, и у вас будет просто цикл, который будет записывать столько переменных типа "string UserString003", сколько вы хотите.
Да, это ужасно. Но, как вы сказали, это концептуальная проблема для домашнего задания,
Я думаю, что вы можете сгенерировать класс Java во время выполнения или, возможно, использовать какой-нибудь скриптовый движок, например Beanshell , для генерации переменных, вы даже можете построить класс по его байт-коду. Но я не понимаю, как вы будете использовать эти переменные в своем коде, вы также должны создать код для работы с этими переменными или использовать для этого отражение ...
Наивное решение:
создайте класс со всеми переменными от var000 до var999 с геттером для каждой ... но это не совсем динамично!
Похоже, ваш профессор предпочитает PHP ( Переменные переменные ), поэтому он думал, возможно ли это в java.
Я лично не знаю Не думаю, что это возможно, не так, как вы предлагаете. Что можно сделать, так это создать классы во время выполнения, используя такие инструменты, как Javassist , чтобы создать более мощный механизм отражения. Таким образом, вы можете создать класс с нужными вам переменными (строка1, строка2 и т. Д.) Во время выполнения.
Однако не забывайте, что Переменные переменные - действительно плохой метод, который приводит к плохой код. Это может быть полезно в очень немногих случаях, но я действительно не рекомендую его.
Вы имеете в виду, что хотите сгенерировать переменные с именем
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
Это невозможно, но это идеальный кандидат для использования одной из коллекций Java.
Либо используйте динамически выделяемый массив:
String[] arr = new String[RUNTIME_SIZE];
Или список, который может изменять свой размер во время выполнения:
List list = new ArrayList<String>();