| /* | |
| * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| /* | |
| * | |
| * @summary Check getEnclosingClass and other methods | |
| * @author Peter von der Ahé | |
| * | |
| * a) Top level classes | |
| * b) Nested classes (static member classes) | |
| * c) Inner classes (non-static member classes) | |
| * d) Local classes (named classes declared within a method) | |
| * e) Anonymous classes | |
| */ | |
| /* | |
| * TODO: | |
| * Test annotations | |
| * Test Locals in static initializers | |
| * Test Locals in methods | |
| * Test Locals in constructors | |
| * Test interfaces | |
| * Test enums | |
| * Test method with a String[] argument | |
| */ | |
| //package | |
| import common.TestMe; | |
| interface MakeClass { | |
| Class<?> make(); | |
| } | |
| public class EnclosingClass { | |
| public EnclosingClass() { | |
| aec = (new Object() {}).getClass(); | |
| } | |
| static class Nested { | |
| static class NestedNested { | |
| } | |
| class NestedInner { | |
| } | |
| Class<?> nestedLocal0; | |
| Class<?> nestedLocal1; | |
| Class<?> nestedLocal2; | |
| { | |
| class NestedLocal0 {}; | |
| nestedLocal0 = NestedLocal0.class; | |
| nestedMethod1(); | |
| nestedMethod2(null); | |
| } | |
| void nestedMethod1() { | |
| class NestedLocal1 {} | |
| nestedLocal1 = NestedLocal1.class; | |
| } | |
| void nestedMethod2(String[] args) { | |
| class NestedLocal2 {} | |
| nestedLocal2 = NestedLocal2.class; | |
| } | |
| Class<?> nestedAnonymous = (new Object() {}).getClass(); | |
| static enum NestedNestedEnum { | |
| } | |
| enum NestedInnerEnum { | |
| } | |
| } | |
| class Inner { | |
| class InnerInner { | |
| } | |
| Class<?> innerLocal0; | |
| Class<?> innerLocal1; | |
| Class<?> innerLocal2; | |
| { | |
| class InnerLocal0 { | |
| }; | |
| innerLocal0 = InnerLocal0.class; | |
| innerMethod1(); | |
| innerMethod2(null); | |
| } | |
| void innerMethod1() { | |
| class InnerLocal1 {} | |
| innerLocal1 = InnerLocal1.class; | |
| } | |
| void innerMethod2(String[] args) { | |
| class InnerLocal2 {} | |
| innerLocal2 = InnerLocal2.class; | |
| } | |
| Class<?> innerAnonymous = (new Object() {}).getClass(); | |
| } | |
| @TestMe(desc="top level class", | |
| encl="null", | |
| simple="EnclosingClass", | |
| canonical="EnclosingClass") | |
| public Class<?> a = EnclosingClass.class; | |
| @TestMe(desc="nested class within top level class", | |
| encl="class EnclosingClass", | |
| simple="Nested", | |
| canonical="EnclosingClass.Nested") | |
| public Class<?> ab = Nested.class; | |
| @TestMe(desc="inner class within top level class", | |
| encl="class EnclosingClass", | |
| simple="Inner", | |
| canonical="EnclosingClass.Inner") | |
| public Class<?> ac = Inner.class; | |
| @TestMe(desc="local class within top level class", | |
| encl="class EnclosingClass", | |
| simple="Local0", | |
| hasCanonical=false) | |
| public Class<?> ad0; | |
| @TestMe(desc="local class within top level class", | |
| encl="class EnclosingClass", | |
| simple="Local1", | |
| hasCanonical=false) | |
| public Class<?> ad1; | |
| @TestMe(desc="local class within top level class", | |
| encl="class EnclosingClass", | |
| simple="Local2", | |
| hasCanonical=false) | |
| public Class<?> ad2; | |
| @TestMe(desc="local class within a top level class static initializer" , | |
| encl="class EnclosingClass", | |
| simple="StaticLocal0", | |
| hasCanonical=false) | |
| public Class<?> sad0; | |
| @TestMe(desc="local class within a top level class static method" , | |
| encl="class EnclosingClass", | |
| simple="StaticLocal1", | |
| hasCanonical=false) | |
| public Class<?> sad1; | |
| @TestMe(desc="local class within a top level class static method", | |
| encl="class EnclosingClass", | |
| simple="StaticLocal2", | |
| hasCanonical=false) | |
| public Class<?> sad2; | |
| { | |
| class Local0 { | |
| class LocalInner {} | |
| { | |
| class LocalLocal {}; | |
| dd = LocalLocal.class; | |
| de = (new Object() {}).getClass(); | |
| } | |
| }; | |
| ad0 = Local0.class; | |
| dc = Local0.LocalInner.class; | |
| new Local0(); | |
| method1(); | |
| method2(null); | |
| sad0 = staticLocal0; | |
| sad1 = staticMethod1(); | |
| sad2 = staticMethod2(null); | |
| } | |
| static Class<?> staticLocal0; | |
| static { | |
| class StaticLocal0 {}; | |
| staticLocal0 = StaticLocal0.class; | |
| } | |
| static Class<?> staticMethod1() { | |
| class StaticLocal1 {}; | |
| return StaticLocal1.class; | |
| } | |
| static Class<?> staticMethod2(String[] args) { | |
| class StaticLocal2 {}; | |
| return StaticLocal2.class; | |
| } | |
| void method1() { | |
| class Local1 {}; | |
| ad1 = Local1.class; | |
| } | |
| void method2(String[] args) { | |
| class Local2 {}; | |
| ad2 = Local2.class; | |
| } | |
| @TestMe(desc="anonymous class within top level class", | |
| encl="class EnclosingClass", | |
| simple="", | |
| hasCanonical=false) | |
| public Class<?> ae = (new Object() {}).getClass(); | |
| @TestMe(desc="anonymous class within top level class constructor", | |
| encl="class EnclosingClass", | |
| simple="", | |
| hasCanonical=false) | |
| public Class<?> aec; | |
| @TestMe(desc="nested class within nested class", | |
| encl="class EnclosingClass$Nested", | |
| simple="NestedNested", | |
| canonical="EnclosingClass.Nested.NestedNested") | |
| public Class<?> bb = Nested.NestedNested.class; | |
| @TestMe(desc="inner class within nested class", | |
| encl="class EnclosingClass$Nested", | |
| simple="NestedInner", | |
| canonical="EnclosingClass.Nested.NestedInner") | |
| public Class<?> bc = Nested.NestedInner.class; | |
| @TestMe(desc="local class within nested class", | |
| encl="class EnclosingClass$Nested", | |
| simple="NestedLocal0", | |
| hasCanonical=false) | |
| public Class<?> bd0 = (new Nested()).nestedLocal0; | |
| @TestMe(desc="local class within nested class", | |
| encl="class EnclosingClass$Nested", | |
| simple="NestedLocal1", | |
| hasCanonical=false) | |
| public Class<?> bd1 = (new Nested()).nestedLocal1; | |
| @TestMe(desc="local class within nested class", | |
| encl="class EnclosingClass$Nested", | |
| simple="NestedLocal2", | |
| hasCanonical=false) | |
| public Class<?> bd2 = (new Nested()).nestedLocal2; | |
| @TestMe(desc="anonymous class within nested class", | |
| encl="class EnclosingClass$Nested", | |
| simple="", | |
| hasCanonical=false) | |
| public Class<?> be = (new Nested()).nestedAnonymous; | |
| @TestMe(desc="nested class within an inner class", encl="", simple="") | |
| public Class<?> cb = Void.class; // not legal | |
| @TestMe(desc="inner class within an inner class", | |
| encl="class EnclosingClass$Inner", | |
| simple="InnerInner", | |
| canonical="EnclosingClass.Inner.InnerInner") | |
| public Class<?> cc = ((new Inner()).new InnerInner()).getClass(); | |
| @TestMe(desc="local class within an inner class", | |
| encl="class EnclosingClass$Inner", | |
| simple="InnerLocal0", | |
| hasCanonical=false) | |
| public Class<?> cd = (new Inner()).innerLocal0; | |
| @TestMe(desc="anonymous class within an inner class", | |
| encl="class EnclosingClass$Inner", | |
| simple="", | |
| hasCanonical=false) | |
| public Class<?> ce = (new Inner()).innerAnonymous; | |
| @TestMe(desc="nested class within a local class", encl="", simple="") | |
| public Class<?> db = Void.class; // not legal | |
| @TestMe(desc="inner class within a local class", | |
| encl="class EnclosingClass$1Local0", | |
| simple="LocalInner", | |
| hasCanonical=false) | |
| public Class<?> dc; // initialized above | |
| @TestMe(desc="local class within a local class", | |
| encl="class EnclosingClass$1Local0", | |
| simple="LocalLocal", | |
| hasCanonical=false) | |
| public Class<?> dd; // initialized above | |
| @TestMe(desc="anonymous class within a local class", | |
| encl="class EnclosingClass$1Local0", | |
| simple="", | |
| hasCanonical=false) | |
| public Class<?> de; // initialized above | |
| @TestMe(desc="nested class within an anonymous class", encl="", simple="") | |
| public Class<?> eb = Void.class; // not legal | |
| @TestMe(desc="inner class within an anonymous class", | |
| encl="class EnclosingClass$3", | |
| simple="AnonymousInner", | |
| hasCanonical=false) | |
| public Class<?> ec = new MakeClass() { | |
| class AnonymousInner {} | |
| public Class<?> make() { return AnonymousInner.class; } | |
| }.make(); | |
| @TestMe(desc="local class within an anonymous class", | |
| encl="class EnclosingClass$4", | |
| simple="AnonymousLocal", | |
| hasCanonical=false) | |
| public Class<?> ed = new MakeClass() { | |
| Class<?> c; | |
| { | |
| class AnonymousLocal {} | |
| c = AnonymousLocal.class; | |
| } | |
| public Class<?> make() { return c; } | |
| }.make(); | |
| @TestMe(desc="anonymous class within an anonymous class", | |
| encl="class EnclosingClass$5", | |
| simple="", | |
| hasCanonical=false) | |
| public Class<?> ee = new MakeClass() { | |
| Class<?> c; | |
| { | |
| c = new Object() {}.getClass(); | |
| } | |
| public Class<?> make() { return c; } | |
| }.make(); | |
| @TestMe(desc="the primitive boolean type", | |
| encl="null", | |
| simple="boolean", | |
| canonical="boolean") | |
| public Class<?> booleanClass = boolean.class; | |
| @TestMe(desc="the primitive char type", | |
| encl="null", | |
| simple="char", | |
| canonical="char") | |
| public Class<?> charClass = char.class; | |
| @TestMe(desc="the primitive byte type", | |
| encl="null", | |
| simple="byte", | |
| canonical="byte") | |
| public Class<?> byteClass = byte.class; | |
| @TestMe(desc="the primitive short type", | |
| encl="null", | |
| simple="short", | |
| canonical="short") | |
| public Class<?> shortClass = short.class; | |
| @TestMe(desc="the primitive int type", | |
| encl="null", | |
| simple="int", | |
| canonical="int") | |
| public Class<?> intClass = int.class; | |
| @TestMe(desc="the primitive long type", | |
| encl="null", | |
| simple="long", | |
| canonical="long") | |
| public Class<?> longClass = long.class; | |
| @TestMe(desc="the primitive float type", | |
| encl="null", | |
| simple="float", | |
| canonical="float") | |
| public Class<?> floatClass = float.class; | |
| @TestMe(desc="the primitive double type", | |
| encl="null", | |
| simple="double", | |
| canonical="double") | |
| public Class<?> doubleClass = double.class; | |
| @TestMe(desc="the primitive void type", | |
| encl="null", | |
| simple="void", | |
| canonical="void") | |
| public Class<?> voidClass = void.class; | |
| } |