Groovy: динамически добавляет методы с определенной подписью - PullRequest
2 голосов
/ 31 марта 2010

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

Использование метакласса. = {...} однако добавляет замыкание, которое не отображается как обычный метод (даже если его можно использовать как один), а также имеет тип возвращаемого значения.

Я не могу изменить метод поиска кода, и он не поддерживает Groovy.

Я не могу использовать methodMissing () или invokeMethod (), потому что метод должен действительно существовать. Если бы я мог перегрузить class.getMethods (), я думаю, что это было бы возможно, но я не могу понять, как.

Есть ли способ сделать это в Groovy?

1 Ответ

2 голосов
/ 31 марта 2010

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

Возможно, вы могли бы заменить объект прокси на основе CGLIB. Если вы можете быть более конкретным в отношении кода, о котором идет речь ...

РЕДАКТИРОВАТЬ: немного больше информации. Groovy metaClass magic не доступен в Java, если в коде Java не было явного вызова groovyClass.invokeMethod("someMethod",args);. Так что нет способа сделать то, что вы просите с MetaClasses. Может быть, CGLIB.

...