Making sure that TypedActor use the same instantiation strategy as FromClassCreator
This commit is contained in:
parent
32dc65aab5
commit
5f335cb8c8
3 changed files with 27 additions and 10 deletions
|
|
@ -10,6 +10,7 @@ import akka.dispatch._
|
|||
import akka.japi.Creator
|
||||
import scala.reflect.ClassTag
|
||||
import akka.routing._
|
||||
import akka.util.Reflect
|
||||
|
||||
/**
|
||||
* Factory for Props instances.
|
||||
|
|
@ -188,10 +189,5 @@ case class Props(
|
|||
* able to optimize serialization.
|
||||
*/
|
||||
private[akka] case class FromClassCreator(clazz: Class[_ <: Actor]) extends Function0[Actor] {
|
||||
def apply(): Actor = try clazz.newInstance catch {
|
||||
case iae: IllegalAccessException ⇒
|
||||
val ctor = clazz.getDeclaredConstructor()
|
||||
ctor.setAccessible(true)
|
||||
ctor.newInstance()
|
||||
}
|
||||
def apply(): Actor = Reflect.instantiate(clazz)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import language.existentials
|
|||
import akka.japi.{ Creator, Option ⇒ JOption }
|
||||
import java.lang.reflect.{ InvocationTargetException, Method, InvocationHandler, Proxy }
|
||||
import akka.util.{ Timeout, NonFatal, Duration }
|
||||
import akka.util.Reflect.instantiator
|
||||
import java.util.concurrent.atomic.{ AtomicReference ⇒ AtomVar }
|
||||
import akka.dispatch._
|
||||
import java.util.concurrent.TimeoutException
|
||||
|
|
@ -463,7 +464,7 @@ object TypedProps {
|
|||
* Scala API
|
||||
*/
|
||||
def apply[T <: AnyRef](interface: Class[_ >: T], implementation: Class[T]): TypedProps[T] =
|
||||
new TypedProps[T](extractInterfaces(interface), () ⇒ implementation.newInstance())
|
||||
new TypedProps[T](extractInterfaces(interface), instantiator(implementation))
|
||||
|
||||
/**
|
||||
* Uses the supplied thunk as the factory for the TypedActor implementation,
|
||||
|
|
@ -507,7 +508,7 @@ case class TypedProps[T <: AnyRef] protected[TypedProps] (
|
|||
*/
|
||||
def this(implementation: Class[T]) =
|
||||
this(interfaces = TypedProps.extractInterfaces(implementation),
|
||||
creator = () ⇒ implementation.newInstance())
|
||||
creator = instantiator(implementation))
|
||||
|
||||
/**
|
||||
* Uses the supplied Creator as the factory for the TypedActor implementation,
|
||||
|
|
@ -519,7 +520,7 @@ case class TypedProps[T <: AnyRef] protected[TypedProps] (
|
|||
*/
|
||||
def this(interface: Class[_ >: T], implementation: Creator[T]) =
|
||||
this(interfaces = TypedProps.extractInterfaces(interface),
|
||||
creator = () ⇒ implementation.create())
|
||||
creator = implementation.create _)
|
||||
|
||||
/**
|
||||
* Uses the supplied class as the factory for the TypedActor implementation,
|
||||
|
|
@ -531,7 +532,7 @@ case class TypedProps[T <: AnyRef] protected[TypedProps] (
|
|||
*/
|
||||
def this(interface: Class[_ >: T], implementation: Class[T]) =
|
||||
this(interfaces = TypedProps.extractInterfaces(interface),
|
||||
creator = () ⇒ implementation.newInstance())
|
||||
creator = instantiator(implementation))
|
||||
|
||||
/**
|
||||
* Returns a new TypedProps with the specified dispatcher set.
|
||||
|
|
|
|||
|
|
@ -29,4 +29,24 @@ private[akka] object Reflect {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* INTERNAL API
|
||||
* @param clazz the class which to instantiate an instance of
|
||||
* @tparam T the type of the instance that will be created
|
||||
* @return a new instance from the default constructor of the given class
|
||||
*/
|
||||
private[akka] def instantiate[T](clazz: Class[T]): T = try clazz.newInstance catch {
|
||||
case iae: IllegalAccessException ⇒
|
||||
val ctor = clazz.getDeclaredConstructor()
|
||||
ctor.setAccessible(true)
|
||||
ctor.newInstance()
|
||||
}
|
||||
|
||||
/**
|
||||
* INTERNAL API
|
||||
* @param clazz the class which to instantiate an instance of
|
||||
* @tparam T the type of the instance that will be created
|
||||
* @return a function which when applied will create a new instance from the default constructor of the given class
|
||||
*/
|
||||
private[akka] def instantiator[T](clazz: Class[T]): () ⇒ T = () ⇒ instantiate(clazz)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue