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