How to create an Akka Actor given the class name

akka, scala

Solution

You could use the Java API (just for the Props instantiation):

val myActor = system.actorOf( 
  new Props( Class.forName( "myActorClassName" ).asInstanceOf[Class[Actor]] ) 
)

The important part is the `new` keyword. If you ommit it, you will use the Scala API instead, which does not allow instantiation by class.

Problem

I would like to create an Akka actor by using the class name, as shown. I've tried many variations of system.actorOf(new Props(theProcessor.getClass), name = "Test"), but I just cannot get this to work. Any idea in creating an Actor from the class loader ``` package com.test import akka.actor.{Props, Actor, ActorRef, ActorSystem} object Main { def main(args: Array[String]) { ActorFromString("Test") } } object ActorFromString { implicit val system = ActorSystem("Test") def apply(name: String): ActorRef = { val className = "com.test." + name + "Processor" val theProcessor: Actor = Class.forName(className).newInstance().asInstanceOf[Actor] system.actorOf(new Props(theProcessor.getClass), name = "Test") } } class TestProcessor extends Actor { def receive = { case data => println("processing data") } } Exception in thread "main" akka.actor.ActorInitializationException: You cannot create an instance of [com.test.TestProcessor] explicitly using the constructor (new). You have to use one of the factory methods to create a new actor. Either use: 'val actor = context.actorOf(Props[MyActor])' (to create a supervised child actor from within an actor), or 'val actor = system.actorOf(Props(new MyActor(..)))' (to create a top level actor from the ActorSystem) at akka.actor.ActorInitializationException$.apply(Actor.scala:166) at akka.actor.Actor$class.$init$(Actor.scala:377) at com.test.TestProcessor.<init>(ActorFromString.scala:20) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at java.lang.Class.newInstance0(Class.java:374) at java.lang.Class.newInstance(Class.java:327) at com.test.ActorFromString$.apply(ActorFromString.scala:15) at com.test.Main$.main(ActorFromString.scala:7) at com.test.Main.main(ActorFromString.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Process finished with exit code 143 ```

Original source