Я использую Grails с сторонними java-библиотеками, и я бы хотел переопределить поведение в одной из этих библиотек.ExpandoMetaClass в Grails для переопределения поведения в библиотеке Java?
Я попытался сделать это в Bootstrap.groovy, например, так:
// class overrides
ExpandoMetaClass.enableGlobally()
SimpleStringFilter.metaClass.passesFilter = {Object itemId, Item item ->
final Property<?> p = item.getItemProperty(propertyId);
if (p == null) {
return false;
}
Object propertyValue = p.getValue();
if (propertyValue == null) {
return false;
}
final String value = ignoreCase ? propertyValue.toString()
.toLowerCase() : propertyValue.toString();
if (onlyMatchPrefix) {
if (!value.startsWith(filterString)) {
return false;
}
} else {
if (!value.contains(filterString)) {
return false;
}
}
return true;
}
Я знаю, за то, что метод passesFilter в классе SimpleStringFilter получает называется, но я поставил точку останова мой код выше, и он никогда не попадал.
Для справки, подпись метода Java является:
public boolean passesFilter(Object itemId, Item item)
Таким образом, можно один на самом деле изменить поведение в Java библиотеки с ExpandoMetaClass во всем мире? Может ли кто-нибудь объяснить поведение и нюансы его использования таким образом?
Спасибо!
fyi - вы можете удалить 'ExpandoMetaClass.enableGlobally()', поскольку Grails называет это в начале процесса запуска. –