Path: blob/master/test/jdk/java/lang/Class/getEnclosingClass/EnclosingClass.java
41153 views
/*1* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24*25* @summary Check getEnclosingClass and other methods26* @author Peter von der Ah\u00e927*28* a) Top level classes29* b) Nested classes (static member classes)30* c) Inner classes (non-static member classes)31* d) Local classes (named classes declared within a method)32* e) Anonymous classes33*/3435/*36* TODO:37* Test annotations38* Test Locals in static initializers39* Test Locals in methods40* Test Locals in constructors41* Test interfaces42* Test enums43* Test method with a String[] argument44*/4546//package4748import common.TestMe;4950interface MakeClass {51Class<?> make();52}5354public class EnclosingClass {55public EnclosingClass() {56aec = (new Object() {}).getClass();57}58static class Nested {59static class NestedNested {60}61class NestedInner {62}63Class<?> nestedLocal0;64Class<?> nestedLocal1;65Class<?> nestedLocal2;66{67class NestedLocal0 {};68nestedLocal0 = NestedLocal0.class;69nestedMethod1();70nestedMethod2(null);71}72void nestedMethod1() {73class NestedLocal1 {}74nestedLocal1 = NestedLocal1.class;75}76void nestedMethod2(String[] args) {77class NestedLocal2 {}78nestedLocal2 = NestedLocal2.class;79}80Class<?> nestedAnonymous = (new Object() {}).getClass();81static enum NestedNestedEnum {82}83enum NestedInnerEnum {84}85}8687class Inner {88class InnerInner {89}90Class<?> innerLocal0;91Class<?> innerLocal1;92Class<?> innerLocal2;93{94class InnerLocal0 {95};96innerLocal0 = InnerLocal0.class;97innerMethod1();98innerMethod2(null);99}100void innerMethod1() {101class InnerLocal1 {}102innerLocal1 = InnerLocal1.class;103}104void innerMethod2(String[] args) {105class InnerLocal2 {}106innerLocal2 = InnerLocal2.class;107}108Class<?> innerAnonymous = (new Object() {}).getClass();109}110111@TestMe(desc="top level class",112encl="null",113simple="EnclosingClass",114canonical="EnclosingClass")115public Class<?> a = EnclosingClass.class;116117@TestMe(desc="nested class within top level class",118encl="class EnclosingClass",119simple="Nested",120canonical="EnclosingClass.Nested")121public Class<?> ab = Nested.class;122@TestMe(desc="inner class within top level class",123encl="class EnclosingClass",124simple="Inner",125canonical="EnclosingClass.Inner")126public Class<?> ac = Inner.class;127@TestMe(desc="local class within top level class",128encl="class EnclosingClass",129simple="Local0",130hasCanonical=false)131public Class<?> ad0;132@TestMe(desc="local class within top level class",133encl="class EnclosingClass",134simple="Local1",135hasCanonical=false)136public Class<?> ad1;137@TestMe(desc="local class within top level class",138encl="class EnclosingClass",139simple="Local2",140hasCanonical=false)141public Class<?> ad2;142@TestMe(desc="local class within a top level class static initializer" ,143encl="class EnclosingClass",144simple="StaticLocal0",145hasCanonical=false)146public Class<?> sad0;147@TestMe(desc="local class within a top level class static method" ,148encl="class EnclosingClass",149simple="StaticLocal1",150hasCanonical=false)151public Class<?> sad1;152@TestMe(desc="local class within a top level class static method",153encl="class EnclosingClass",154simple="StaticLocal2",155hasCanonical=false)156public Class<?> sad2;157{158class Local0 {159class LocalInner {}160{161class LocalLocal {};162dd = LocalLocal.class;163de = (new Object() {}).getClass();164}165};166ad0 = Local0.class;167dc = Local0.LocalInner.class;168new Local0();169method1();170method2(null);171sad0 = staticLocal0;172sad1 = staticMethod1();173sad2 = staticMethod2(null);174}175static Class<?> staticLocal0;176static {177class StaticLocal0 {};178staticLocal0 = StaticLocal0.class;179}180static Class<?> staticMethod1() {181class StaticLocal1 {};182return StaticLocal1.class;183}184static Class<?> staticMethod2(String[] args) {185class StaticLocal2 {};186return StaticLocal2.class;187}188void method1() {189class Local1 {};190ad1 = Local1.class;191}192void method2(String[] args) {193class Local2 {};194ad2 = Local2.class;195}196@TestMe(desc="anonymous class within top level class",197encl="class EnclosingClass",198simple="",199hasCanonical=false)200public Class<?> ae = (new Object() {}).getClass();201@TestMe(desc="anonymous class within top level class constructor",202encl="class EnclosingClass",203simple="",204hasCanonical=false)205public Class<?> aec;206207@TestMe(desc="nested class within nested class",208encl="class EnclosingClass$Nested",209simple="NestedNested",210canonical="EnclosingClass.Nested.NestedNested")211public Class<?> bb = Nested.NestedNested.class;212@TestMe(desc="inner class within nested class",213encl="class EnclosingClass$Nested",214simple="NestedInner",215canonical="EnclosingClass.Nested.NestedInner")216public Class<?> bc = Nested.NestedInner.class;217@TestMe(desc="local class within nested class",218encl="class EnclosingClass$Nested",219simple="NestedLocal0",220hasCanonical=false)221public Class<?> bd0 = (new Nested()).nestedLocal0;222@TestMe(desc="local class within nested class",223encl="class EnclosingClass$Nested",224simple="NestedLocal1",225hasCanonical=false)226public Class<?> bd1 = (new Nested()).nestedLocal1;227@TestMe(desc="local class within nested class",228encl="class EnclosingClass$Nested",229simple="NestedLocal2",230hasCanonical=false)231public Class<?> bd2 = (new Nested()).nestedLocal2;232@TestMe(desc="anonymous class within nested class",233encl="class EnclosingClass$Nested",234simple="",235hasCanonical=false)236public Class<?> be = (new Nested()).nestedAnonymous;237238@TestMe(desc="nested class within an inner class", encl="", simple="")239public Class<?> cb = Void.class; // not legal240@TestMe(desc="inner class within an inner class",241encl="class EnclosingClass$Inner",242simple="InnerInner",243canonical="EnclosingClass.Inner.InnerInner")244public Class<?> cc = ((new Inner()).new InnerInner()).getClass();245@TestMe(desc="local class within an inner class",246encl="class EnclosingClass$Inner",247simple="InnerLocal0",248hasCanonical=false)249public Class<?> cd = (new Inner()).innerLocal0;250@TestMe(desc="anonymous class within an inner class",251encl="class EnclosingClass$Inner",252simple="",253hasCanonical=false)254public Class<?> ce = (new Inner()).innerAnonymous;255256@TestMe(desc="nested class within a local class", encl="", simple="")257public Class<?> db = Void.class; // not legal258@TestMe(desc="inner class within a local class",259encl="class EnclosingClass$1Local0",260simple="LocalInner",261hasCanonical=false)262public Class<?> dc; // initialized above263@TestMe(desc="local class within a local class",264encl="class EnclosingClass$1Local0",265simple="LocalLocal",266hasCanonical=false)267public Class<?> dd; // initialized above268@TestMe(desc="anonymous class within a local class",269encl="class EnclosingClass$1Local0",270simple="",271hasCanonical=false)272public Class<?> de; // initialized above273274@TestMe(desc="nested class within an anonymous class", encl="", simple="")275public Class<?> eb = Void.class; // not legal276@TestMe(desc="inner class within an anonymous class",277encl="class EnclosingClass$3",278simple="AnonymousInner",279hasCanonical=false)280public Class<?> ec = new MakeClass() {281class AnonymousInner {}282public Class<?> make() { return AnonymousInner.class; }283}.make();284@TestMe(desc="local class within an anonymous class",285encl="class EnclosingClass$4",286simple="AnonymousLocal",287hasCanonical=false)288public Class<?> ed = new MakeClass() {289Class<?> c;290{291class AnonymousLocal {}292c = AnonymousLocal.class;293}294public Class<?> make() { return c; }295}.make();296@TestMe(desc="anonymous class within an anonymous class",297encl="class EnclosingClass$5",298simple="",299hasCanonical=false)300public Class<?> ee = new MakeClass() {301Class<?> c;302{303c = new Object() {}.getClass();304}305public Class<?> make() { return c; }306}.make();307308@TestMe(desc="the primitive boolean type",309encl="null",310simple="boolean",311canonical="boolean")312public Class<?> booleanClass = boolean.class;313314@TestMe(desc="the primitive char type",315encl="null",316simple="char",317canonical="char")318public Class<?> charClass = char.class;319320@TestMe(desc="the primitive byte type",321encl="null",322simple="byte",323canonical="byte")324public Class<?> byteClass = byte.class;325326@TestMe(desc="the primitive short type",327encl="null",328simple="short",329canonical="short")330public Class<?> shortClass = short.class;331332@TestMe(desc="the primitive int type",333encl="null",334simple="int",335canonical="int")336public Class<?> intClass = int.class;337338@TestMe(desc="the primitive long type",339encl="null",340simple="long",341canonical="long")342public Class<?> longClass = long.class;343344@TestMe(desc="the primitive float type",345encl="null",346simple="float",347canonical="float")348public Class<?> floatClass = float.class;349350@TestMe(desc="the primitive double type",351encl="null",352simple="double",353canonical="double")354public Class<?> doubleClass = double.class;355356@TestMe(desc="the primitive void type",357encl="null",358simple="void",359canonical="void")360public Class<?> voidClass = void.class;361362}363364365