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; 38301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughesimport libcore.reflect.GenericSignatureParser; 39301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughesimport libcore.reflect.ListOfTypes; 40301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughesimport libcore.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 77301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes private int methodDexIndex; 78301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Prevent this class from being instantiated. 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Constructor(){ 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //do nothing 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an instance of the class. Only called from native code, thus 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * private. 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param declaringClass 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the class this constructor object belongs to 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param ptypes 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameter types of the constructor 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param extypes 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the exception types of the constructor 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param slot 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the slot of the constructor inside the VM class structure 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 99b208e2804c6dfb6271cc02b3a42c683408e6f9f6Brian Carlstrom private Constructor(Class<T> declaringClass, Class<?>[] ptypes, Class<?>[] extypes, int slot, int methodDexIndex) { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.declaringClass = declaringClass; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.parameterTypes = ptypes; 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.exceptionTypes = extypes; // may be null 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.slot = slot; 104301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes this.methodDexIndex = methodDexIndex; 105301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes } 106301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes 107ce938ea0c8eb5806cdfa339d29ea20e45cc968f8Elliott Hughes /** @hide */ 108301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes public int getDexMethodIndex() { 109301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes return methodDexIndex; 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override /*package*/ String getSignatureAttribute() { 113e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson Object[] annotation = Method.getSignatureAnnotation(declaringClass, slot); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (annotation == null) { 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return StringUtils.combineStrings(annotation); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public TypeVariable<Constructor<T>>[] getTypeParameters() { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return formalTypeParameters.clone(); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the string representation of the constructor's declaration, 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * including the type parameters. 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string representation of the constructor's declaration 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toGenericString() { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder sb = new StringBuilder(80); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append modifiers if any 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int modifier = getModifiers(); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (modifier != 0) { 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(Modifier.toString(modifier & ~Modifier.VARARGS)).append(' '); 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append type parameters 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (formalTypeParameters != null && formalTypeParameters.length > 0) { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append('<'); 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < formalTypeParameters.length; i++) { 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project appendGenericType(sb, formalTypeParameters[i]); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (i < formalTypeParameters.length - 1) { 1477281ea4092279f3091ffa3be91a4c66c3b63e080Jesse Wilson sb.append(","); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append("> "); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append constructor name 153a0ee76b0850774edeb0c67204070b89d117573bcJesse Wilson appendTypeName(sb, getDeclaringClass()); 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // append parameters 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append('('); 156d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers appendArrayGenericType(sb, Types.getTypeArray(genericParameterTypes, false)); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(')'); 1585310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes // append exceptions if any 159d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers Type[] genericExceptionTypeArray = Types.getTypeArray(genericExceptionTypes, false); 1605310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes if (genericExceptionTypeArray.length > 0) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(" throws "); 1625310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes appendArrayGenericType(sb, genericExceptionTypeArray); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sb.toString(); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the generic parameter types as an array of {@code Type} 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instances, in declaration order. If this constructor has no generic 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameters, an empty array is returned. 171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the parameter types 173f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws GenericSignatureFormatError 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the generic constructor signature is invalid 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws TypeNotPresentException 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any parameter type points to a missing type 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws MalformedParameterizedTypeException 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any parameter type points to a type that cannot be 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instantiated for some reason 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Type[] getGenericParameterTypes() { 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 184d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers return Types.getTypeArray(genericParameterTypes, true); 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the exception types as an array of {@code Type} instances. If 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this constructor has no declared exceptions, an empty array will be 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned. 191f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an array of generic exception types 193f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws GenericSignatureFormatError 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the generic constructor signature is invalid 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws TypeNotPresentException 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any exception type points to a missing type 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws MalformedParameterizedTypeException 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any exception type points to a type that cannot be 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instantiated for some reason 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Type[] getGenericExceptionTypes() { 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project initGenericTypes(); 204d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers return Types.getTypeArray(genericExceptionTypes, true); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Annotation[] getDeclaredAnnotations() { 209e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson return Method.getDeclaredAnnotations(declaringClass, slot); 210e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson } 211e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson 212e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson @Override public <A extends Annotation> A getAnnotation(Class<A> annotationType) { 213e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson if (annotationType == null) { 214e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson throw new NullPointerException("annotationType == null"); 215e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson } 216e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson return Method.getAnnotation(declaringClass, slot, annotationType); 217e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson } 218e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson 219e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) { 220e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson if (annotationType == null) { 221e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson throw new NullPointerException("annotationType == null"); 222e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson } 223e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson return Method.isAnnotationPresent(declaringClass, slot, annotationType); 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an array of arrays that represent the annotations of the formal 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameters of this constructor. If there are no parameters on this 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor, then an empty array is returned. If there are no annotations 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * set, then an array of empty arrays is returned. 231f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an array of arrays of {@code Annotation} instances 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Annotation[][] getParameterAnnotations() { 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Annotation[][] parameterAnnotations 236e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson = Method.getParameterAnnotations(declaringClass, slot); 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (parameterAnnotations.length == 0) { 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Method.noAnnotations(parameterTypes.length); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return parameterAnnotations; 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether or not this constructor takes a variable number of 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * arguments. 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if a vararg is declare, otherwise 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isVarArgs() { 251e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson int mods = Method.getMethodModifiers(declaringClass, slot); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (mods & Modifier.VARARGS) != 0; 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether or not this constructor is synthetic (artificially 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * introduced by the compiler). 258f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this constructor is synthetic, {@code false} 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isSynthetic() { 263e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson int mods = Method.getMethodModifiers(declaringClass, slot); 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (mods & Modifier.SYNTHETIC) != 0; 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether or not the specified {@code object} is equal to this 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor. To be equal, the specified object must be an instance 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of {@code Constructor} with the same declaring class and parameter types 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * as this constructor. 272f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to compare 275f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object is equal to this 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor, {@code false} otherwise 278f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #hashCode 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equals(Object object) { 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return object instanceof Constructor && toString().equals(object.toString()); 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the class that declares this constructor. 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the declaring class 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Class<T> getDeclaringClass() { 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return declaringClass; 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the exception types as an array of {@code Class} instances. If 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this constructor has no declared exceptions, an empty array will be 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned. 299f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the declared exception classes 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Class<?>[] getExceptionTypes() { 303693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes if (exceptionTypes == null) { 304693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes return EmptyArray.CLASS; 305693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes } 3065310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes return exceptionTypes.clone(); 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the modifiers for this constructor. The {@link Modifier} class 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should be used to decode the result. 312f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the modifiers for this constructor 314f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Modifier 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getModifiers() { 318e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson return Method.getMethodModifiers(declaringClass, slot); 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the name of this constructor. 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the name of this constructor 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getName() { 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return declaringClass.getName(); 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an array of the {@code Class} objects associated with the 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameter types of this constructor. If the constructor was declared with 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * no parameters, an empty array will be returned. 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the parameter types 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Class<?>[] getParameterTypes() { 3385310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes return parameterTypes.clone(); 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the constructor's signature in non-printable form. This is called 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (only) from IO native code and needed for deriving the serialVersionUID 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the class 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the constructor's signature 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unused") 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String getSignature() { 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder result = new StringBuilder(); 351f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append('('); 3530d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes for (int i = 0; i < parameterTypes.length; i++) { 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(getSignature(parameterTypes[i])); 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(")V"); 357f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result.toString(); 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an integer hash code for this constructor. Constructors which are 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * equal return the same value for this method. The hash code for a 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructor is the hash code of the name of the declaring class. 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the hash code 367f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #equals 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return declaringClass.getName().hashCode(); 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of the declaring class, initialized by dynamically 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invoking the constructor represented by this {@code Constructor} object. 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This reproduces the effect of {@code new declaringClass(arg1, arg2, ... , 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * argN)} This method performs the following: 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A new instance of the declaring class is created. If the declaring 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class cannot be instantiated (i.e. abstract class, an interface, an array 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type, or a primitive type) then an InstantiationException is thrown.</li> 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If this Constructor object is enforcing access control (see 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link AccessibleObject}) and this constructor is not accessible from the 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * current context, an IllegalAccessException is thrown.</li> 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the number of arguments passed and the number of parameters do not 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * match, an IllegalArgumentException is thrown.</li> 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>For each argument passed: 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the corresponding parameter type is a primitive type, the argument 3928da55422ed93013260c1536080b14661bfecfefbElliott Hughes * is unboxed. If the unboxing fails, an IllegalArgumentException is 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown.</li> 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>If the resulting argument cannot be converted to the parameter type 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * via a widening conversion, an IllegalArgumentException is thrown.</li> 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The constructor represented by this {@code Constructor} object is 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then invoked. If an exception is thrown during the invocation, it is 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * caught and wrapped in an InvocationTargetException. This exception is 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then thrown. If the invocation completes normally, the newly initialized 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object is returned. 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 403f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param args 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the arguments to the constructor 406f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the new, initialized, object 408f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception InstantiationException 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the class cannot be instantiated 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalAccessException 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this constructor is not accessible 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalArgumentException 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an incorrect number of arguments are passed, or an 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * argument could not be converted by a widening conversion 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception InvocationTargetException 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an exception was thrown by the invoked constructor 418f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see AccessibleObject 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public T newInstance(Object... args) throws InstantiationException, IllegalAccessException, 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IllegalArgumentException, InvocationTargetException { 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return constructNative (args, declaringClass, parameterTypes, slot, flag); 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private native T constructNative(Object[] args, Class<T> declaringClass, 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?>[] parameterTypes, int slot, 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean noAccessCheck) throws InstantiationException, IllegalAccessException, 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InvocationTargetException; 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of this 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * constructor. The format of the string is: 434f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol> 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>modifiers (if any) 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>declaring class name 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'(' 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>parameter types, separated by ',' (if any) 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>')' 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'throws' plus exception types, separated by ',' (if any) 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol> 443f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For example: 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code public String(byte[],String) throws UnsupportedEncodingException} 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this constructor 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StringBuilder result = new StringBuilder(Modifier.toString(getModifiers())); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (result.length() != 0) 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(' '); 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(declaringClass.getName()); 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append("("); 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(toString(parameterTypes)); 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(")"); 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (exceptionTypes != null && exceptionTypes.length != 0) { 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(" throws "); 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result.append(toString(exceptionTypes)); 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 463f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result.toString(); 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 467