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