Есть ли способ автоматически конвертировать Groovy в Java?

я унаследовал значительное количество кода Groovy, и мне было трудно поддерживать его по нескольким причинам:

  1. очень часто трудно сказать, какой тип переменной.
  2. следствие: легко изменить переменную с другим типом и не знать об этом.
  3. многие ошибки будут обнаружены до времени выполнения (что страшно, если ваше модульное тестирование не охватывает почти все).
  4. тип параметры в основном игнорируются.
  5. IDE, которую я использую (STS Pro), полезна, но далеко отстает от Java. Например, рефакторинг просто недоступен.
  6. предложения доступны несколько раз, другие, нет.

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

Я попытался вручную преобразовать некоторые части в Java, это было больно. Вы знаете о каких-либо инструментах или плагинах, которые помогают с этим обращением?

8 ответов


IntelliJ IDEA имеет вполне приличную поддержку рефакторинга кода groovy. Он также имеет конвертер уровня исходного кода от Groovy - > Java. Большую часть времени он генерирует код, который не компилируется, но это может помочь вам начать процесс преобразования кода. Groovy-код:

class HelloWorld {
def name
def greet() { "Hello ${name}" }
int add(int a, int b) {
    return a+b;
}
}

преобразовать Java код:

public class HelloWorld {
public GString greet() {
    return "Hello " + String.valueOf(name);
}

public int add(int a, int b) {
    return a + b;
}

public Object getName() {
    return name;
}

public void setName(Object name) {
    this.name = name;
}

private Object name;
}

вероятно, это не тот ответ, который вы хотите услышать, но я бы сосредоточился на том, чтобы стать более удобным с Groovy вместо того, чтобы пытаться преобразовать код в Java. Есть много вещей, которые вы можете сделать в Groovy, которые просто не будут хорошо переводиться на Java (например,закрытие). Любое автоматическое преобразование в Java сделает код гораздо менее читаемым и трудным для понимания.

Если вы не можете убедить придерживаться Groovy, и вы должны перейти на Java, лучше всего будет сделать это вручную.


языки Groovy и Java компилируются в один байт-код (байт-код платформы Java). Так что просто (а) скомпилируйте .groovy file to a .class file; (b) используйте декомпилятор, такой как JDGUI, чтобы декомпилировать ваш .файл класса для .Java-файл.


мой верхний наконечник написать много модульных тестов.

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

Я думаю, что это решит большинство ваших проблем.


Я нашел и альтернативное решение, используя Groovy++. Он имеет почти все преимущества Groovy, но с производительностью и сильным набором текста с Java. Кроме того, он основан на Groovy, поэтому, по-видимому, вам нужно добавить только один файл jar и аннотацию "@Typed" в верхней части кода.

кроме того, он добавляет новые функции, такие как "GrUnit", и позволяет смешивать динамические и статические типы, которые, я надеюсь, позволят создать DSL. Так он позволяет смешивать с существующим Groovy код и использование с граалями.

проект кажется идти быть молодым, но действительно многообещающим. Я уже проверяю воду и проверяю, как далеко я могу зайти.

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


есть один вопрос год назад. После одного или двух месяцев заводной эйфории, это было изменение в реальном мире слабым. Даже GReclipse 2.0 не меньше боли, кода становится unmanageabe и болезненным. Короткий ответ на ваш вопрос - нет. Для этого нет по-настоящему хорошего инструмента. GSql я заменяю на Spring JdbcTemplate, закрытие с обратными вызовами. Все это требует ручного решения стратегии замены, поэтому, если вы хотите получить хороший код, вам нужно сделать int manauly. Иначе вы можете использовать java декомпиляторы, но я думаю, что это не то, что вы действительно хотите.


мы изменили бы около 1000 классов Groovy на Java 8.

  • автоматически: я думаю, что это возможно в сочетании с ручными шагами

возможные шаги для миграции

  • переменные def: замените вручную правильное имя класса в IDE

  • Def Methodes: замените вручную правильное имя класса в качестве возвращаемого значения в IDE

  • файл переименовать : Автоматически заменить все .заводные файлы .java-файлы (Java 8)

  • clousures: замените вручную Java 8 Lambdas и Java 8 Streams

  • Groovy overritten Methodes: замените вручную новыми классами Java jdk, т. е. новым файлом io, новым API даты или включите библиотеки Apache

используйте модульные тесты для управления рефакторингом.

PS: мы usw. Eclipse с плагином Groovy.

приветы Roebi


для тех, кто имеет подобный вопрос, вы можете взглянуть на GMavenPlus