Должны ли классы Groovy @CompileStatic по-прежнему включать код метакласса?
Я начинаю включать некоторые классы Groovy в мое Spring-приложение, созданное в Maven, в первую очередь для того, чтобы уменьшить количество шаблонов для многих классов, которые являются POJO и объектами-значениями. (Для сравнения, я использовал Roo для работы с шаблоном, но Roo становится все более нестабильным с новыми версиями Spring и Maven.) Один из моих классов Spring Data MongoDB выглядит так:
@Document
class ConcreteProcessingJob implements ImageAssetProcessingJob {
@Id
String id
@Indexed(unique = true, sparse = true)
String jobId
@NotNull
@Past
Date started
// more of the same
}
Поскольку это просто заурядные объекты структуры, мне не нужны или не нужны сложности и издержки метаклассирования и размещения вызовов в Groovy; Я просто хочу эквивалент POJO. Я пытался аннотировать классы с @CompileStatic
, но пока пару звонков в байт-коде заменили invokedynamic
с invokevirtual
Я все еще становлюсь огромным .class
файлы с несколькими большими Groovy-методами и структурами данных; один класс, который является ничем иным, как пустым подклассом, который реализует универсальный суперкласс, занимает более 5 тысяч байт-кода.
Я скомпилировал код как внутри Eclipse, так и из командной строки, используя groovy-eclipse-compiler
(2.8.0-01) оба раза, и хотя есть некоторые незначительные различия, в байт-коде все еще есть все динамическое "раздувание". Зависимость Groovy, которую я использую, - 2.3.2, и мои цели Java установлены на 1.7.
Ожидается ли это даже для целого класса, отмеченного @CompileStatic
чтобы все метаданные Groovy и -код были скомпилированы в него? Если так, есть ли другой способ отключить это?