Constructor.java revision 6186821cb13f4ac7ff50950c813394367e021eae
1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License. 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.lang.reflect; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.annotation.Annotation; 366186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.EmptyArray; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.kernel.vm.StringUtils; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.lang.reflect.GenericSignatureParser; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.lang.reflect.ListOfTypes; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.lang.reflect.Types; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents a constructor. Information about the constructor can be 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * accessed, and the constructor can be invoked dynamically. 45f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param <T> the class that declares this constructor 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class Constructor<T> extends AccessibleObject implements GenericDeclaration, 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Member { 50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<T> declaringClass; 52f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?>[] parameterTypes; 54f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?>[] exceptionTypes; 56f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListOfTypes genericExceptionTypes; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListOfTypes genericParameterTypes; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TypeVariable<Constructor<T>>[] formalTypeParameters; 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private volatile boolean genericTypesAreInitialized = false; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private synchronized void initGenericTypes() { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!genericTypesAreInitialized) { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String signatureAttribute = getSignatureAttribute(); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project GenericSignatureParser parser = new GenericSignatureParser( 66f3507d0976cb14ba59e0715f22f4c6b7c97cbae8Jesse Wilson declaringClass.getClassLoader()); 6798a7a76fe5c0dd5ff949b38da809368681169205Jesse Wilson parser.parseForConstructor(this, signatureAttribute, exceptionTypes); 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project formalTypeParameters = parser.formalTypeParameters; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project genericParameterTypes = parser.parameterTypes; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project genericExceptionTypes = parser.exceptionTypes; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project genericTypesAreInitialized = true; 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int slot; 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Prevent this class from being instantiated. 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Constructor(){ 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //do nothing 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an instance of the class. Only called from native code, thus 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * private. 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param declaringClass 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the class this constructor object belongs to 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param ptypes 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameter types of the constructor 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param extypes 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the exception types of the constructor 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param slot 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the slot of the constructor inside the VM class structure 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Constructor (Class<T> declaringClass, Class<?>[] ptypes, Class<?>[] extypes, int slot){ 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.declaringClass = declaringClass; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.parameterTypes = ptypes; 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.exceptionTypes = extypes; // may be null 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.slot = slot; 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override /*package*/ String getSignatureAttribute() { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] annotation = getSignatureAnnotation(declaringClass, slot); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (annotation == null) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return StringUtils.combineStrings(annotation); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Get the Signature annotation for this constructor. Returns null if not 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * found. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project native private Object[] getSignatureAnnotation(Class declaringClass, 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int slot); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public TypeVariable<Constructor<T>>[] getTypeParameters() { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return formalTypeParameters.clone(); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the string representation of the constructor's declaration, 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including the type parameters. 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string representation of the constructor's declaration 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toGenericString() { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder sb = new StringBuilder(80); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append modifiers if any 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int modifier = getModifiers(); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (modifier != 0) { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(Modifier.toString(modifier & ~Modifier.VARARGS)).append(' '); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append type parameters 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (formalTypeParameters != null && formalTypeParameters.length > 0) { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append('<'); 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < formalTypeParameters.length; i++) { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project appendGenericType(sb, formalTypeParameters[i]); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (i < formalTypeParameters.length - 1) { 1467281ea4092279f3091ffa3be91a4c66c3b63e080Jesse Wilson sb.append(","); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append("> "); 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append constructor name 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project appendArrayType(sb, getDeclaringClass()); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append parameters 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append('('); 155f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes appendArrayGenericType(sb, 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Types.getClonedTypeArray(genericParameterTypes)); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(')'); 1585310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes // append exceptions if any 159f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes Type[] genericExceptionTypeArray = 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Types.getClonedTypeArray(genericExceptionTypes); 1615310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes if (genericExceptionTypeArray.length > 0) { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(" throws "); 1635310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes appendArrayGenericType(sb, genericExceptionTypeArray); 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sb.toString(); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the generic parameter types as an array of {@code Type} 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instances, in declaration order. If this constructor has no generic 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameters, an empty array is returned. 172f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the parameter types 174f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws GenericSignatureFormatError 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the generic constructor signature is invalid 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws TypeNotPresentException 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any parameter type points to a missing type 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws MalformedParameterizedTypeException 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any parameter type points to a type that cannot be 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instantiated for some reason 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Type[] getGenericParameterTypes() { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Types.getClonedTypeArray(genericParameterTypes); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the exception types as an array of {@code Type} instances. If 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this constructor has no declared exceptions, an empty array will be 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned. 192f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an array of generic exception types 194f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws GenericSignatureFormatError 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the generic constructor signature is invalid 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws TypeNotPresentException 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any exception type points to a missing type 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws MalformedParameterizedTypeException 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any exception type points to a type that cannot be 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instantiated for some reason 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Type[] getGenericExceptionTypes() { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Types.getClonedTypeArray(genericExceptionTypes); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Annotation[] getDeclaredAnnotations() { 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getDeclaredAnnotations(declaringClass, slot); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project native private Annotation[] getDeclaredAnnotations(Class declaringClass, 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int slot); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an array of arrays that represent the annotations of the formal 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameters of this constructor. If there are no parameters on this 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor, then an empty array is returned. If there are no annotations 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set, then an array of empty arrays is returned. 220f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an array of arrays of {@code Annotation} instances 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Annotation[][] getParameterAnnotations() { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Annotation[][] parameterAnnotations 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project = getParameterAnnotations(declaringClass, slot); 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (parameterAnnotations.length == 0) { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Method.noAnnotations(parameterTypes.length); 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return parameterAnnotations; 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project native private Annotation[][] getParameterAnnotations(Class declaringClass, 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int slot); 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether or not this constructor takes a variable number of 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * arguments. 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if a vararg is declare, otherwise 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isVarArgs() { 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int mods = getConstructorModifiers(declaringClass, slot); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (mods & Modifier.VARARGS) != 0; 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether or not this constructor is synthetic (artificially 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * introduced by the compiler). 249f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this constructor is synthetic, {@code false} 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isSynthetic() { 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int mods = getConstructorModifiers(declaringClass, slot); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (mods & Modifier.SYNTHETIC) != 0; 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether or not the specified {@code object} is equal to this 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor. To be equal, the specified object must be an instance 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of {@code Constructor} with the same declaring class and parameter types 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * as this constructor. 263f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to compare 266f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object is equal to this 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor, {@code false} otherwise 269f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #hashCode 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equals(Object object) { 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return object instanceof Constructor && toString().equals(object.toString()); 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the class that declares this constructor. 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the declaring class 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Class<T> getDeclaringClass() { 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return declaringClass; 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the exception types as an array of {@code Class} instances. If 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this constructor has no declared exceptions, an empty array will be 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned. 290f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the declared exception classes 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Class<?>[] getExceptionTypes() { 294693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes if (exceptionTypes == null) { 295693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes return EmptyArray.CLASS; 296693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes } 2975310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes return exceptionTypes.clone(); 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the modifiers for this constructor. The {@link Modifier} class 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should be used to decode the result. 303f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the modifiers for this constructor 305f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Modifier 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getModifiers() { 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getConstructorModifiers(declaringClass, slot); 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private native int getConstructorModifiers(Class<T> declaringClass, int slot); 313f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the name of this constructor. 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the name of this constructor 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getName() { 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return declaringClass.getName(); 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an array of the {@code Class} objects associated with the 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameter types of this constructor. If the constructor was declared with 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * no parameters, an empty array will be returned. 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the parameter types 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Class<?>[] getParameterTypes() { 3315310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes return parameterTypes.clone(); 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the constructor's signature in non-printable form. This is called 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (only) from IO native code and needed for deriving the serialVersionUID 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the class 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the constructor's signature 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unused") 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String getSignature() { 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder result = new StringBuilder(); 344f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append('('); 346f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes for(int i = 0; i < parameterTypes.length; i++) { 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(getSignature(parameterTypes[i])); 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(")V"); 350f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result.toString(); 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an integer hash code for this constructor. Constructors which are 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * equal return the same value for this method. The hash code for a 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructor is the hash code of the name of the declaring class. 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the hash code 360f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #equals 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return declaringClass.getName().hashCode(); 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of the declaring class, initialized by dynamically 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invoking the constructor represented by this {@code Constructor} object. 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This reproduces the effect of {@code new declaringClass(arg1, arg2, ... , 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * argN)} This method performs the following: 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A new instance of the declaring class is created. If the declaring 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class cannot be instantiated (i.e. abstract class, an interface, an array 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type, or a primitive type) then an InstantiationException is thrown.</li> 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If this Constructor object is enforcing access control (see 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link AccessibleObject}) and this constructor is not accessible from the 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * current context, an IllegalAccessException is thrown.</li> 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of arguments passed and the number of parameters do not 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * match, an IllegalArgumentException is thrown.</li> 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>For each argument passed: 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the corresponding parameter type is a primitive type, the argument 3858da55422ed93013260c1536080b14661bfecfefbElliott Hughes * is unboxed. If the unboxing fails, an IllegalArgumentException is 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown.</li> 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the resulting argument cannot be converted to the parameter type 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * via a widening conversion, an IllegalArgumentException is thrown.</li> 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The constructor represented by this {@code Constructor} object is 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then invoked. If an exception is thrown during the invocation, it is 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * caught and wrapped in an InvocationTargetException. This exception is 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then thrown. If the invocation completes normally, the newly initialized 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object is returned. 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 396f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param args 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the arguments to the constructor 399f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the new, initialized, object 401f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception InstantiationException 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the class cannot be instantiated 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalAccessException 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this constructor is not accessible 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalArgumentException 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an incorrect number of arguments are passed, or an 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * argument could not be converted by a widening conversion 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception InvocationTargetException 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an exception was thrown by the invoked constructor 411f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see AccessibleObject 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public T newInstance(Object... args) throws InstantiationException, IllegalAccessException, 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IllegalArgumentException, InvocationTargetException { 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return constructNative (args, declaringClass, parameterTypes, slot, flag); 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private native T constructNative(Object[] args, Class<T> declaringClass, 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?>[] parameterTypes, int slot, 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean noAccessCheck) throws InstantiationException, IllegalAccessException, 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InvocationTargetException; 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of this 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor. The format of the string is: 427f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol> 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>modifiers (if any) 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>declaring class name 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'(' 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>parameter types, separated by ',' (if any) 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>')' 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'throws' plus exception types, separated by ',' (if any) 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol> 436f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For example: 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code public String(byte[],String) throws UnsupportedEncodingException} 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this constructor 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder result = new StringBuilder(Modifier.toString(getModifiers())); 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (result.length() != 0) 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(' '); 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(declaringClass.getName()); 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append("("); 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(toString(parameterTypes)); 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(")"); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (exceptionTypes != null && exceptionTypes.length != 0) { 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(" throws "); 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(toString(exceptionTypes)); 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 456f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result.toString(); 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 460