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