From 8ce6ac3e3e5e0c066e2db25d07a97bb21c26afd0 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 13 Jun 2012 12:23:02 +0200 Subject: [PATCH 1/3] #2217 - setting accessible = true before newInstance --- .../test/java/akka/actor/NonPublicClass.java | 22 +++++++++++++++++++ .../test/scala/akka/actor/ActorRefSpec.scala | 7 ++++++ .../src/main/scala/akka/actor/Props.scala | 6 ++++- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java diff --git a/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java new file mode 100644 index 0000000000..55f3910db7 --- /dev/null +++ b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java @@ -0,0 +1,22 @@ +package akka.actor; + +import com.sun.xml.internal.ws.api.PropertySet; + +/** + * Created by IntelliJ IDEA. + * User: viktorklang + * Date: 6/13/12 + * Time: 12:12 PM + * To change this template use File | Settings | File Templates. + */ +public class NonPublicClass { + public static Props createProps() { + return new Props(MyNonPublicActorClass.class); + } +} + +class MyNonPublicActorClass extends UntypedActor { + @Override public void onReceive(Object msg) { + getSender().tell(msg); + } +} \ No newline at end of file diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala index bec066d97a..3056dc9e95 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala @@ -358,6 +358,13 @@ class ActorRefSpec extends AkkaSpec with DefaultTimeout { system.stop(serverRef) } + "support actorOfs where the class of the actor isn't public" in { + val a = system.actorOf(NonPublicClass.createProps()) + a.tell("pigdog", testActor) + expectMsg("pigdog") + system stop a + } + "stop when sent a poison pill" in { val timeout = Timeout(20000) val ref = system.actorOf(Props(new Actor { diff --git a/akka-actor/src/main/scala/akka/actor/Props.scala b/akka-actor/src/main/scala/akka/actor/Props.scala index fc01a5ba36..91c4ced285 100644 --- a/akka-actor/src/main/scala/akka/actor/Props.scala +++ b/akka-actor/src/main/scala/akka/actor/Props.scala @@ -186,5 +186,9 @@ case class Props( * able to optimize serialization. */ private[akka] case class FromClassCreator(clazz: Class[_ <: Actor]) extends Function0[Actor] { - def apply(): Actor = clazz.newInstance + def apply(): Actor = { + val ctor = clazz.getDeclaredConstructor() + ctor.setAccessible(true) + ctor.newInstance() + } } From 1eb6681b3c9c23d60dce31c17acaf58cafd09643 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 13 Jun 2012 15:11:19 +0200 Subject: [PATCH 2/3] Removing horrid IDEA autogenerated section and adding Typesafe copyright to NonPublicClass.java --- .../src/test/java/akka/actor/NonPublicClass.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java index 55f3910db7..850d82cd62 100644 --- a/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java +++ b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java @@ -1,14 +1,9 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + package akka.actor; -import com.sun.xml.internal.ws.api.PropertySet; - -/** - * Created by IntelliJ IDEA. - * User: viktorklang - * Date: 6/13/12 - * Time: 12:12 PM - * To change this template use File | Settings | File Templates. - */ public class NonPublicClass { public static Props createProps() { return new Props(MyNonPublicActorClass.class); From 6bb1bf679562c60538c84fd14a828c4c2c5140e2 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 13 Jun 2012 15:19:58 +0200 Subject: [PATCH 3/3] Switching to getDeclaredConstructor.newInstance as a fallback --- akka-actor/src/main/scala/akka/actor/Props.scala | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Props.scala b/akka-actor/src/main/scala/akka/actor/Props.scala index 91c4ced285..e1d8e3b04c 100644 --- a/akka-actor/src/main/scala/akka/actor/Props.scala +++ b/akka-actor/src/main/scala/akka/actor/Props.scala @@ -186,9 +186,10 @@ case class Props( * able to optimize serialization. */ private[akka] case class FromClassCreator(clazz: Class[_ <: Actor]) extends Function0[Actor] { - def apply(): Actor = { - val ctor = clazz.getDeclaredConstructor() - ctor.setAccessible(true) - ctor.newInstance() + def apply(): Actor = try clazz.newInstance catch { + case iae: IllegalAccessException ⇒ + val ctor = clazz.getDeclaredConstructor() + ctor.setAccessible(true) + ctor.newInstance() } }