Я бы согласился с предыдущими ответами / комментариями о том, что нет способа сделать именно то, что вы хотите ", используя стандартный набор функций JDK." Таким образом, вам придется делать некоторое генерирование кода, хотя это не обязательно потребует изменений в системе сборки. Так как вы спрашиваете:
... Если нет, то что нужно для его создания?
... Для простого случая, не слишком много, я думаю. Предположим, я поместил свои примитивные операции в класс утилит:
public class NumberUtils {
// @PrimitiveMethodsStart
/** Find maximum of int inputs */
public static int max(int a, int b) {
return (a > b) ? a : b;
}
/** Sum the int inputs */
public static int sum(int a, int b) {
return a + b;
}
// @PrimitiveMethodsEnd
// @GeneratedPrimitiveMethodsStart - Do not edit below
// @GeneratedPrimitiveMethodsEnd
}
Тогда я могу написать простой процессор менее чем в 30 строках следующим образом:
public class PrimitiveMethodProcessor {
private static final String PRIMITIVE_METHODS_START = "@PrimitiveMethodsStart";
private static final String PRIMITIVE_METHODS_END = "@PrimitiveMethodsEnd";
private static final String GENERATED_PRIMITIVE_METHODS_START = "@GeneratedPrimitiveMethodsStart";
private static final String GENERATED_PRIMITIVE_METHODS_END = "@GeneratedPrimitiveMethodsEnd";
public static void main(String[] args) throws Exception {
String fileName = args[0];
BufferedReader inputStream = new BufferedReader(new FileReader(fileName));
PrintWriter outputStream = null;
StringBuilder outputContents = new StringBuilder();
StringBuilder methodsToCopy = new StringBuilder();
boolean inPrimitiveMethodsSection = false;
boolean inGeneratedPrimitiveMethodsSection = false;
try {
for (String line;(line = inputStream.readLine()) != null;) {
if(line.contains(PRIMITIVE_METHODS_END)) inPrimitiveMethodsSection = false;
if(inPrimitiveMethodsSection)methodsToCopy.append(line).append('\n');
if(line.contains(PRIMITIVE_METHODS_START)) inPrimitiveMethodsSection = true;
if(line.contains(GENERATED_PRIMITIVE_METHODS_END)) inGeneratedPrimitiveMethodsSection = false;
if(!inGeneratedPrimitiveMethodsSection)outputContents.append(line).append('\n');
if(line.contains(GENERATED_PRIMITIVE_METHODS_START)) {
inGeneratedPrimitiveMethodsSection = true;
String methods = methodsToCopy.toString();
for (String primative : new String[]{"long", "float", "double"}) {
outputContents.append(methods.replaceAll("int\\s", primative + " ")).append('\n');
}
}
}
outputStream = new PrintWriter(new FileWriter(fileName));
outputStream.print(outputContents.toString());
} finally {
inputStream.close();
if(outputStream!= null) outputStream.close();
}
}
}
Это заполнит раздел @GeneratedPrimitiveMethods длинными, плавающими и двойными версиями методов в разделе @PrimitiveMethods.
// @GeneratedPrimitiveMethodsStart - Do not edit below
/** Find maximum of long inputs */
public static long max(long a, long b) {
return (a > b) ? a : b;
}
...
Это намеренно простой пример, и я уверен, что он не охватывает все случаи, но вы понимаете суть и видите, как его можно расширить, например. искать несколько файлов или использовать обычные аннотации и определять конец метода.
Кроме того, хотя вы можете настроить это как шаг в вашей системе сборки, я настроил его для запуска в качестве сборщика перед сборщиком Java в моем проекте eclipse. Теперь всякий раз, когда я редактирую файл и нажимаю сохранить; он обновляется автоматически менее чем за четверть секунды. Таким образом, это становится скорее инструментом редактирования, чем шагом в системе сборки.
Просто мысль ...