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