17e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden/*
27e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * Copyright (C) 2007 The Android Open Source Project
37e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden *
47e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
57e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * you may not use this file except in compliance with the License.
67e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * You may obtain a copy of the License at
77e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden *
87e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
97e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden *
107e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * Unless required by applicable law or agreed to in writing, software
117e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
127e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * See the License for the specific language governing permissions and
147e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden * limitations under the License.
157e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17d3e57403913382d4173c3190b38ab1aae136c565Andy McFaddenimport java.lang.reflect.Constructor;
18d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Test instance creation.
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Main {
23a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    private static boolean FULL_ACCESS_CHECKS = false;  // b/5861201
24a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void main(String[] args) {
26d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        testClassNewInstance();
27d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        testConstructorNewInstance();
28d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    }
29d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
30d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    /**
31d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden     * Tests Class.newInstance().
32d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden     */
33d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    static void testClassNewInstance() {
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // should succeed
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class c = Class.forName("LocalClass");
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object obj = c.newInstance();
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.out.println("LocalClass succeeded");
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.err.println("LocalClass failed");
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ex.printStackTrace();
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // should fail
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class c = Class.forName("otherpackage.PackageAccess");
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object obj = c.newInstance();
487e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden            System.err.println("ERROR: PackageAccess succeeded unexpectedly");
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalAccessException iae) {
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.out.println("Got expected PackageAccess complaint");
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.err.println("Got unexpected PackageAccess failure");
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ex.printStackTrace();
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        LocalClass3.main();
577e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden
587e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden        try {
597e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden            MaybeAbstract ma = new MaybeAbstract();
607e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden            System.err.println("ERROR: MaybeAbstract succeeded unexpectedly");
617e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden        } catch (InstantiationError ie) {
627e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden            System.out.println("Got expected InstantationError");
637e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden        } catch (Exception ex) {
647e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden            System.err.println("Got unexpected MaybeAbstract failure");
657e3f161c5d4d2940a4771e543431fe3ba4a22f67Andy McFadden        }
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
67d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
68d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    /**
69d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden     * Tests Constructor.newInstance().
70d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden     */
71d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    static void testConstructorNewInstance() {
72d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        // should fail -- getConstructor only returns public constructors
73d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        try {
74d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Class c = Class.forName("LocalClass");
75d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Constructor cons = c.getConstructor(new Class[0] /*(Class[])null*/);
76d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("Cons LocalClass succeeded unexpectedly");
77d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        } catch (NoSuchMethodException nsme) {
78d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.out.println("Cons LocalClass failed as expected");
79d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        } catch (Exception ex) {
80d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("Cons LocalClass failed strangely");
81d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            ex.printStackTrace();
82d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        }
83d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
84d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        // should succeed
85d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        try {
86d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Class c = Class.forName("LocalClass2");
87d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Constructor cons = c.getConstructor((Class[]) null);
88d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Object obj = cons.newInstance();
89d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.out.println("Cons LocalClass2 succeeded");
90d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        } catch (Exception ex) {
91d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("Cons LocalClass2 failed");
92d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            ex.printStackTrace();
93d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        }
94d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
95d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        // should fail
96d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        try {
97d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Class c = Class.forName("otherpackage.PackageAccess");
98d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Constructor cons = c.getConstructor(new Class[0] /*(Class[])null*/);
99d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("ERROR: Cons PackageAccess succeeded unexpectedly");
100d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        } catch (NoSuchMethodException nsme) {
101a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            // constructor isn't public
102d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.out.println("Cons got expected PackageAccess complaint");
103d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        } catch (Exception ex) {
104d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("Cons got unexpected PackageAccess failure");
105d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            ex.printStackTrace();
106d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        }
107d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
108d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        // should fail
109d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        try {
110d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Class c = Class.forName("MaybeAbstract");
111d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Constructor cons = c.getConstructor(new Class[0] /*(Class[])null*/);
112d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            Object obj = cons.newInstance();
113d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("ERROR: Cons MaybeAbstract succeeded unexpectedly");
114d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        } catch (InstantiationException ie) {
115d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            // note InstantiationException vs. InstantiationError
116d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.out.println("Cons got expected InstantationException");
117d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        } catch (Exception ex) {
118d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("Cons got unexpected MaybeAbstract failure");
119d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            ex.printStackTrace();
120d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        }
121a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
122a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        // should fail
123a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
124a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            Class c = Class.forName("otherpackage.PackageAccess2");
125a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            Constructor cons = c.getConstructor((Class[]) null);
126a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            if (!FULL_ACCESS_CHECKS) { throw new IllegalAccessException(); }
127a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            Object obj = cons.newInstance();
128a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            System.err.println("ERROR: Cons PackageAccess2 succeeded unexpectedly");
129a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (IllegalAccessException iae) {
130a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            // constructor is public, but class has package scope
131a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            System.out.println("Cons got expected PackageAccess2 complaint");
132a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (Exception ex) {
133a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            System.err.println("Cons got unexpected PackageAccess2 failure");
134a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            ex.printStackTrace();
135a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
136a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
137d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    }
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass LocalClass {
141d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    // this class has a default constructor with package visibility
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass LocalClass2 {
145d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    public LocalClass2() {}
146d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden}
147d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
148d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
149d3e57403913382d4173c3190b38ab1aae136c565Andy McFaddenclass LocalClass3 {
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void main() {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            CC.newInstance();
153d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.out.println("LocalClass3 succeeded");
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception ex) {
155d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            System.err.println("Got unexpected LocalClass3 failure");
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ex.printStackTrace();
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class CC {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private CC() {}
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        static Object newInstance() {
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Class c = CC.class;
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.newInstance();
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception ex) {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ex.printStackTrace();
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return null;
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
174