
com.googlecode.classgenerator.ProxyFactory.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of classgenerator Show documentation
Show all versions of classgenerator Show documentation
classgenerator is a scala library that wraps javassist and provides various
patterns for generating classes via subclassing and implementing interfaces.
package com.googlecode.classgenerator
import javassist.util.proxy.Proxy
import javassist.util.proxy.MethodHandler
import java.lang.reflect.Method
import java.lang.reflect.Constructor
import javassist.util.proxy.MethodFilter
/**
* @author kostantinos.kougios
*
* 8 Apr 2012
*/
class ProxyFactory[T] protected[classgenerator] (
handled: Handled,
interfaces: Array[Class[_]],
invokeF: (Object, Method, Method, Array[Object]) => Object,
clz: Class[T]) {
private val pf = new javassist.util.proxy.ProxyFactory
if (!interfaces.isEmpty) pf.setInterfaces(interfaces)
pf.setSuperclass(clz)
pf.setFilter(new MethodFilter {
def isHandled(m: Method) = handled(m)
})
val proxyClass = pf.createClass.asInstanceOf[Class[T]]
def constructor(args: Class[_]*) =
proxyClass.getConstructor(args: _*)
def newInstance(constructor: Constructor[T], params: Array[Any]) = {
val n = constructor.newInstance(params.asInstanceOf[Array[Object]]: _*)
init(n)
n
}
def newInstance = {
val n = proxyClass.newInstance
init(n)
n
}
private val methodHandler = new MethodHandler {
override def invoke(self: Object, m: Method, proceed: Method, args: Array[Object]): Object =
invokeF(self, m, proceed, args).asInstanceOf[Object]
}
private def init(t: T) {
val proxy = t.asInstanceOf[Proxy]
proxy.setHandler(methodHandler)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy