动态代理没有明确指定scala中的类型

Jen*_*der 5 proxy scala dynamic

是否有可能有一个方法,它接受一个任意的实例并返回一个java.reflection.Proxy或类似的与原始参数相同的类型?

我想它应该看起来像这样:

def createProxy[S](model: S)(implicit manifest: Manifest[S]): S = {...}
Run Code Online (Sandbox Code Playgroud)

或这个

def createProxy[S, T<:S](model: S)(implicit manifest: Manifest[S]): T = {...}
Run Code Online (Sandbox Code Playgroud)

其中T是S的子类型,它是由所有实现的接口的组合产生的,因为它似乎不能代理实际的类,而只是接口.

Hir*_*ino 3

我认为以下应该可以解决问题。请注意,它无法返回 S,因为 S 可能不是接口。

import java.lang.reflect._

def createProxy[S](model: S)(implicit manifest: Manifest[S]) = {
  val clazz = manifest.erasure 
  Proxy.newProxyInstance(clazz.getClassLoader, clazz.getInterfaces, new InvocationHandler() {
    def invoke(proxy:Object, method:Method, args:scala.Array[Object]) = {
      method.invoke(model, args:_*)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)