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