In the groovy.util package we find the Proxy class. We can use this class to create a proxy for another object. All methods calls to the proxy object are redirected to the original object, instead for the methods we override in the proxy class:
class User {
String name
String email
String password
String displayName() { name }
}
class UserProxy extends groovy.util.Proxy {
List fields
// Override getProperty for custom behavior by the proxy.
Object getProperty(String propertyName) {
if (propertyName in fields) {
getAdaptee().getProperty(propertyName)
} else {
throw new MissingPropertyException("Unknown property $propertyName")
}
}
}
def user = new User(name: 'mrhaki', email: 'private@localhost', password: 'secret')
def userProxy= new UserProxy(fields: ['name']).wrap(user) // Create proxy for user instance.
assert 'mrhaki' == userProxy.name
try {
userProxy.email
assert false
} catch (MissingPropertyException e) {
assert 'Unknown property email' == e.message
}
assert 'mrhaki' == userProxy.displayName() // Use original method.