在情況下,當你使用單一的界面,你可以做這樣的事情(基於希蘭Chirino回答)要代理的對象:
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])
這樣,我成功地引進,而無痛AOP成米餅模式的代碼庫。
有點舊但尚未...代理可以轉換爲接口而不是具體的類 – ozma 2017-05-02 17:03:11