Hi Martin, I'm away from my workstation at the moment, so this is from memory. IIRC a local class is pure scoping and lacks an "outer this" which is what you annotate for constructors. There should not be receiver type to annotate. Since I can't run your code I can't see what's wrong but I might be able to help if you paste the output from a run.
Cheers /Joel On Jul 21, 2016 19:49, "Martin Buchholz" <marti...@google.com> wrote: > Hi Joel, Paul, > > A coworker ran into the change of behavior here in jdk9. Specifically, we > noticed that a local class constructor has a receiver parameter, > but getAnnotatedReceiverType returns null. The changed jdk9 spec is > actually very clear about that: > > > http://download.java.net/java/jdk9/docs/api/java/lang/reflect/Constructor.html#getAnnotatedReceiverType-- > """If this Executable object represents a static method or represents a > constructor of a top level, static member, local, or anonymous class, then > the return value is null.""" > > BUT we can't think of any reason WHY a local inner class would be treated > differently from an inner member class. Why not the simple and obvious > rule: if there is a receiver parameter, return an appropriate non-null > AnnotatedType? > > You already have an excellent jtreg test, but here's what I was playing > with: > > import java.lang.reflect.Constructor; > > public class LocalClassReceiverTypeBug { > public static void main(String[] args) throws Throwable { > class StaticLocal {} > printConstructor(StaticLocal.class); > new LocalClassReceiverTypeBug().instanceMain(); > } > > public void instanceMain() throws Throwable { > class InstanceLocal {} > printConstructor(InstanceLocal.class); > printConstructor(Inner.class); > printConstructor(Nested.class); > } > > static class Nested {} > class Inner {} > > static void printConstructor(Class<?> klazz) { > Constructor<?>[] constructors = klazz.getDeclaredConstructors(); > if (constructors.length != 1) throw new AssertionError(); > System.out.printf("constructor=%s%n", constructors[0]); > System.out.printf("receiver type=%s%n", > constructors[0].getAnnotatedReceiverType()); > } > } > > > > On Wed, Aug 13, 2014 at 1:54 AM, Joel Borggren-Franck < > joel.fra...@oracle.com> wrote: > >> Hi Paul, >> >> On 2014-06-24, Paul Sandoz wrote: >> > >> > On Jun 17, 2014, at 6:52 PM, Joel Borggrén-Franck < >> joel.fra...@oracle.com> wrote: >> > > >> > > Can I get a review for this fix and javadoc clarification for >> https://bugs.openjdk.java.net/browse/JDK-8044629 >> > > >> > >> > +1 >> > >> > I never quite realised just how convoluted it was to determine that a >> class is an inner class. >> >> Neither did I until I had to implement it :) >> >> cheers >> /Joel >> > >