Groovy - Как заменить методы существующих классов Java - PullRequest
1 голос
/ 09 февраля 2012

Как заменить методы существующего Java-класса ( GrailsDataBinder в моем случае). Я читал, что вызовы методов для классов Java не проходят через invokeMethod, и, следовательно, он не работает, но я думаю, что будет какое-то решение.

Я только что попробовал это

GrailsDataBinder.metaClass.static.createBinder = {Object target, String objectName ->   
  throw new RuntimeException() 
} 

А это

GrailsDataBinder.class.metaClass.static.createBinder = {Object target, String 
  objectName -> throw new RuntimeException() 
} 

Но это, похоже, не заменило метод, так как мое закрытие не вызывается, а вместо этого выполняется оригинальный метод.

обновление

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

void testDataBinder() {
    GrailsDataBinder.createBinder(null, null)
}

Однако, когда он вызывается из DataBindingUtils, он всегда выполняет оригинальный метод (DataBindingUtils также является классом java)

Ниже приведен код внутри DataBindingUtils, который вызывает метод.

binder = GrailsDataBinder.createBinder(object, object.getClass().getName());

Примечание. Ранее задавались некоторые похожие вопросы, но ни один из них не помог мне.

1 Ответ

1 голос
/ 06 сентября 2012

Это разочаровывает, когда вы видите силу Groovy.Однако, как вы уже знаете, многие классные функции метакласса и т. Д., Доступные в Groovy, просто не работают так, как вы хотели бы в классах Java.

Если вы пытаетесь переопределить, заглушить или смоделировать материал наJava-класс для модульного тестирования и т. Д., Я советую заглянуть в Spock, поскольку он использует «магию», которая на самом деле работает и на Java-классах.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...