Как заменить методы существующего 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());
Примечание. Ранее задавались некоторые похожие вопросы, но ни один из них не помог мне.