В ситуациях, когда вы хотите проксировать объект, используя один интерфейс, вы можете сделать что-то вроде этого (основываясь на ответе Хирама Кирино):
import java.lang.reflect.{Method, InvocationHandler, Proxy}
def createProxy[I](proxee: I, interfaceClass: Class[I]): I = {
assert(interfaceClass.isInterface, "interfaceClass should be an inteface class")
Proxy.newProxyInstance(interfaceClass.getClassLoader, Array(interfaceClass), new InvocationHandler() {
override def invoke(proxy: Object, method: Method, args: Array[Object]) = {
println("before")
val result = method.invoke(proxee, args: _*)
println("after")
result
}
}).asInstanceOf[I]
}
И имея интерфейс SessionSvc
используйте его так:
val sessionSvc = createProxy(new SessionSvcMongo, classOf[SessionSvc])
Таким образом, мне удалось внедрить довольно безболезненное АОП в кодовую базу на основе шаблонов тортов.