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