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;
36c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughesimport java.util.Arrays;
37b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilsonimport java.util.Comparator;
386186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.EmptyArray;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.kernel.vm.StringUtils;
40301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughesimport libcore.reflect.GenericSignatureParser;
41301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughesimport libcore.reflect.ListOfTypes;
42301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughesimport libcore.reflect.Types;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents a method. Information about the method can be accessed,
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and the method can be invoked dynamically.
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class Method extends AccessibleObject implements GenericDeclaration, Member {
49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
50b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson    /**
519babc0429286668ed6ae5d8f2427d5853fc00e46Jesse Wilson     * Orders methods by their name, parameters and return type.
52b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson     *
53b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson     * @hide
54b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson     */
55b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson    public static final Comparator<Method> ORDER_BY_SIGNATURE = new Comparator<Method>() {
56b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson        public int compare(Method a, Method b) {
57b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            int comparison = a.name.compareTo(b.name);
58b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            if (comparison != 0) {
59b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson                return comparison;
60b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            }
61b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson
62b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            Class<?>[] aParameters = a.parameterTypes;
63b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            Class<?>[] bParameters = b.parameterTypes;
64b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            int length = Math.min(aParameters.length, bParameters.length);
65b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            for (int i = 0; i < length; i++) {
66b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson                comparison = aParameters[i].getName().compareTo(bParameters[i].getName());
67b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson                if (comparison != 0) {
68b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson                    return comparison;
69b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson                }
70b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson            }
71b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson
729babc0429286668ed6ae5d8f2427d5853fc00e46Jesse Wilson            if (aParameters.length != bParameters.length) {
739babc0429286668ed6ae5d8f2427d5853fc00e46Jesse Wilson                return aParameters.length - bParameters.length;
749babc0429286668ed6ae5d8f2427d5853fc00e46Jesse Wilson            }
759babc0429286668ed6ae5d8f2427d5853fc00e46Jesse Wilson
769babc0429286668ed6ae5d8f2427d5853fc00e46Jesse Wilson            // this is necessary for methods that have covariant return types.
779babc0429286668ed6ae5d8f2427d5853fc00e46Jesse Wilson            return a.getReturnType().getName().compareTo(b.getReturnType().getName());
78b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson        }
79b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson    };
80b92764b27a1e26c4251c436d5cba299f6df05243Jesse Wilson
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int slot;
82f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
83301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes    private final int methodDexIndex;
84301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Class<?> declaringClass;
86f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String name;
88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Class<?>[] parameterTypes;
90f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Class<?>[] exceptionTypes;
92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Class<?> returnType;
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private ListOfTypes genericExceptionTypes;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private ListOfTypes genericParameterTypes;
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Type genericReturnType;
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private TypeVariable<Method>[] formalTypeParameters;
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile boolean genericTypesAreInitialized = false;
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private synchronized void initGenericTypes() {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!genericTypesAreInitialized) {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String signatureAttribute = getSignatureAttribute();
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            GenericSignatureParser parser = new GenericSignatureParser(
105f3507d0976cb14ba59e0715f22f4c6b7c97cbae8Jesse Wilson                    declaringClass.getClassLoader());
10698a7a76fe5c0dd5ff949b38da809368681169205Jesse Wilson            parser.parseForMethod(this, signatureAttribute, exceptionTypes);
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            formalTypeParameters = parser.formalTypeParameters;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            genericParameterTypes = parser.parameterTypes;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            genericExceptionTypes = parser.exceptionTypes;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            genericReturnType = parser.returnType;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            genericTypesAreInitialized = true;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
115301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes    private Method(Class<?> declaring, Class<?>[] paramTypes, Class<?>[] exceptTypes, Class<?> returnType, String name, int slot, int methodDexIndex) {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.declaringClass = declaring;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.name = name;
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.slot = slot;
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.parameterTypes = paramTypes;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.exceptionTypes = exceptTypes;      // may be null
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.returnType = returnType;
122301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes        this.methodDexIndex = methodDexIndex;
123301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes    }
124301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes
125ce938ea0c8eb5806cdfa339d29ea20e45cc968f8Elliott Hughes    /** @hide */
126301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes    public int getDexMethodIndex() {
127301174b9ed79a73e35d7463f06ae48eb0654c6caElliott Hughes        return methodDexIndex;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public TypeVariable<Method>[] getTypeParameters() {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initGenericTypes();
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return formalTypeParameters.clone();
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** {@inheritDoc} */
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override /*package*/ String getSignatureAttribute() {
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object[] annotation = getSignatureAnnotation(declaringClass, slot);
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (annotation == null) {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return StringUtils.combineStrings(annotation);
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the Signature annotation for this method. Returns {@code null} if
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * not found.
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
150e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    static native Object[] getSignatureAnnotation(Class declaringClass, int slot);
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string representation of the method's declaration, including
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the type parameters.
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string representation of this method
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toGenericString() {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder sb = new StringBuilder(80);
160f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initGenericTypes();
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append modifiers if any
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int modifier = getModifiers();
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (modifier != 0) {
166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(Modifier.toString(modifier & ~(Modifier.BRIDGE +
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Modifier.VARARGS))).append(' ');
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append type parameters
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (formalTypeParameters != null && formalTypeParameters.length > 0) {
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append('<');
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < formalTypeParameters.length; i++) {
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                appendGenericType(sb, formalTypeParameters[i]);
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i < formalTypeParameters.length - 1) {
1757281ea4092279f3091ffa3be91a4c66c3b63e080Jesse Wilson                    sb.append(",");
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append("> ");
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append return type
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        appendGenericType(sb, Types.getType(genericReturnType));
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(' ');
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append method name
184a0ee76b0850774edeb0c67204070b89d117573bcJesse Wilson        appendTypeName(sb, getDeclaringClass());
1857281ea4092279f3091ffa3be91a4c66c3b63e080Jesse Wilson        sb.append(".").append(getName());
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append parameters
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append('(');
188d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers        appendArrayGenericType(sb, Types.getTypeArray(genericParameterTypes, false));
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(')');
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // append exceptions if any
191d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers        Type[] genericExceptionTypeArray = Types.getTypeArray(genericExceptionTypes, false);
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (genericExceptionTypeArray.length > 0) {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(" throws ");
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            appendArrayGenericType(sb, genericExceptionTypeArray);
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the parameter types as an array of {@code Type} instances, in
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * declaration order. If this method has no parameters, an empty array is
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returned.
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the parameter types
205f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws GenericSignatureFormatError
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the generic method signature is invalid
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws TypeNotPresentException
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if any parameter type points to a missing type
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MalformedParameterizedTypeException
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if any parameter type points to a type that cannot be
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             instantiated for some reason
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Type[] getGenericParameterTypes() {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initGenericTypes();
216d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers        return Types.getTypeArray(genericParameterTypes, true);
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the exception types as an array of {@code Type} instances. If
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this method has no declared exceptions, an empty array will be returned.
222f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an array of generic exception types
224f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws GenericSignatureFormatError
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the generic method signature is invalid
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws TypeNotPresentException
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if any exception type points to a missing type
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MalformedParameterizedTypeException
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if any exception type points to a type that cannot be
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             instantiated for some reason
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Type[] getGenericExceptionTypes() {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initGenericTypes();
235d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers        return Types.getTypeArray(genericExceptionTypes, true);
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the return type of this method as a {@code Type} instance.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the return type of this method
242f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws GenericSignatureFormatError
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the generic method signature is invalid
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws TypeNotPresentException
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the return type points to a missing type
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws MalformedParameterizedTypeException
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the return type points to a type that cannot be
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             instantiated for some reason
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Type getGenericReturnType() {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        initGenericTypes();
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Types.getType(genericReturnType);
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Annotation[] getDeclaredAnnotations() {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDeclaredAnnotations(declaringClass, slot);
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
260e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    static native Annotation[] getDeclaredAnnotations(Class<?> declaringClass, int slot);
261e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson
262e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    @Override public <A extends Annotation> A getAnnotation(Class<A> annotationType) {
263e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        if (annotationType == null) {
264e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            throw new NullPointerException("annotationType == null");
265e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        }
266e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        return getAnnotation(declaringClass, slot, annotationType);
267e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    }
268e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    static native <A extends Annotation> A getAnnotation(
269e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            Class<?> declaringClass, int slot, Class<A> annotationType);
270e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson
271e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
272e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        if (annotationType == null) {
273e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            throw new NullPointerException("annotationType == null");
274e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        }
275e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson        return isAnnotationPresent(declaringClass, slot, annotationType);
276e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    }
277e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    static native boolean isAnnotationPresent(
278e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson            Class<?> declaringClass, int slot, Class<? extends Annotation> annotationType);
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final Annotation[] NO_ANNOTATIONS = new Annotation[0];
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an array of empty Annotation arrays.
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*package*/ static Annotation[][] noAnnotations(int size) {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Annotation[][] annotations = new Annotation[size][];
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < size; i++) {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            annotations[i] = NO_ANNOTATIONS;
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return annotations;
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an array of arrays that represent the annotations of the formal
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parameters of this method. If there are no parameters on this method,
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then an empty array is returned. If there are no annotations set, then
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and array of empty arrays is returned.
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an array of arrays of {@code Annotation} instances
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Annotation[][] getParameterAnnotations() {
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Annotation[][] parameterAnnotations
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                = getParameterAnnotations(declaringClass, slot);
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (parameterAnnotations.length == 0) {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return noAnnotations(parameterTypes.length);
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parameterAnnotations;
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
310e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    static native Annotation[][] getParameterAnnotations(Class declaringClass, int slot);
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether or not this method takes a variable number argument.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if a vararg is declared, {@code false} otherwise
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isVarArgs() {
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int modifiers = getMethodModifiers(declaringClass, slot);
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (modifiers & Modifier.VARARGS) != 0;
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether or not this method is a bridge.
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this method is a bridge, {@code false} otherwise
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isBridge() {
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int modifiers = getMethodModifiers(declaringClass, slot);
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (modifiers & Modifier.BRIDGE) != 0;
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether or not this method is synthetic.
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this method is synthetic, {@code false} otherwise
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isSynthetic() {
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int modifiers = getMethodModifiers(declaringClass, slot);
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (modifiers & Modifier.SYNTHETIC) != 0;
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the default value for the annotation member represented by this
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method.
345f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the default value, or {@code null} if none
347f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws TypeNotPresentException
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this annotation member is of type {@code Class} and no
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             definition can be found
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getDefaultValue() {
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getDefaultValue(declaringClass, slot);
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    native private Object getDefaultValue(Class declaringClass, int slot);
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether or not the specified {@code object} is equal to this
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method. To be equal, the specified object must be an instance
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of {@code Method} with the same declaring class and parameter types
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as this method.
362f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare
365f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         method, {@code false} otherwise
368f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object object) {
373c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        if (this == object) {
374c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes            return true;
375c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        }
376c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        if (!(object instanceof Method)) {
377c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes            return false;
378c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        }
379c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        Method rhs = (Method) object;
380c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        // We don't compare exceptionTypes because two methods
381c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        // can't differ only by their declared exceptions.
382c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes        return declaringClass.equals(rhs.declaringClass) &&
383c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes            name.equals(rhs.name) &&
384c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes            getModifiers() == rhs.getModifiers() &&
385c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes            returnType.equals(rhs.returnType) &&
386c498f38c65457c271f8bb0afa0b903fab91a1303Elliott Hughes            Arrays.equals(parameterTypes, rhs.parameterTypes);
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the class that declares this method.
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the declaring class
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Class<?> getDeclaringClass() {
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return declaringClass;
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the exception types as an array of {@code Class} instances. If
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this method has no declared exceptions, an empty array is returned.
401f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the declared exception classes
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Class<?>[] getExceptionTypes() {
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exceptionTypes == null) {
406693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes            return EmptyArray.CLASS;
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
4085310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes        return exceptionTypes.clone();
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the modifiers for this method. The {@link Modifier} class should
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be used to decode the result.
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the modifiers for this method
416f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Modifier
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getModifiers() {
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getMethodModifiers(declaringClass, slot);
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
423e62cb8ba7337b0ec19545e119246e0fc5f2c973fJesse Wilson    static native int getMethodModifiers(Class<?> declaringClass, int slot);
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the method represented by this {@code Method}
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * instance.
428f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this method
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getName() {
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name;
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an array of {@code Class} objects associated with the parameter
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * types of this method. If the method was declared with no parameters, an
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * empty array will be returned.
439f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the parameter types
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Class<?>[] getParameterTypes() {
4435310d25cec568714f8174f05ef34a89b4662cd03Elliott Hughes        return parameterTypes.clone();
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Class} associated with the return type of this
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method.
449f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the return type
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Class<?> getReturnType() {
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return returnType;
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an integer hash code for this method. Objects which are equal
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * return the same value for this method. The hash code for this Method is
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the hash code of the name of this method.
460f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return hash code for this method
462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #equals
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name.hashCode();
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4718da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * Returns the result of dynamically invoking this method. Equivalent to
4728da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * {@code receiver.methodName(arg1, arg2, ... , argN)}.
4738da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
4748da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If the method is static, the receiver argument is ignored (and may be null).
4758da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
4768da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If the method takes no arguments, you can pass {@code (Object[]) null} instead of
4778da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * allocating an empty array.
4788da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
4798da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If you're calling a varargs method, you need to pass an {@code Object[]} for the
4808da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * varargs parameter: that conversion is usually done in {@code javac}, not the VM, and
4818da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * the reflection machinery does not do this for you. (It couldn't, because it would be
4828da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * ambiguous.)
4838da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
4848da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>Reflective method invocation follows the usual process for method lookup.
4858da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
4868da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If an exception is thrown during the invocation it is caught and
4878da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * wrapped in an InvocationTargetException. This exception is then thrown.
4888da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *
4898da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * <p>If the invocation completes normally, the return value itself is
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returned. If the method is declared to return a primitive type, the
4918da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * return value is boxed. If the return type is void, null is returned.
492f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param receiver
4948da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *            the object on which to call this method (or null for static methods)
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param args
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the arguments to the method
4978da55422ed93013260c1536080b14661bfecfefbElliott Hughes     * @return the result
498f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
5008da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *             if {@code receiver == null} for a non-static method
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessException
5028da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *             if this method is not accessible (see {@link AccessibleObject})
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
5048da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *             if the number of arguments doesn't match the number of parameters, the receiver
5058da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *             is incompatible with the declaring class, or an argument could not be unboxed
5068da55422ed93013260c1536080b14661bfecfefbElliott Hughes     *             or converted by a widening conversion to the corresponding parameter type
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvocationTargetException
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an exception was thrown by the invoked method
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object invoke(Object receiver, Object... args)
5118da55422ed93013260c1536080b14661bfecfefbElliott Hughes            throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (args == null) {
513693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes            args = EmptyArray.OBJECT;
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
5158da55422ed93013260c1536080b14661bfecfefbElliott Hughes        return invokeNative(receiver, args, declaringClass, parameterTypes, returnType, slot, flag);
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
5188da55422ed93013260c1536080b14661bfecfefbElliott Hughes    private native Object invokeNative(Object obj, Object[] args, Class<?> declaringClass,
5198da55422ed93013260c1536080b14661bfecfefbElliott Hughes            Class<?>[] parameterTypes, Class<?> returnType, int slot, boolean noAccessCheck)
5208da55422ed93013260c1536080b14661bfecfefbElliott Hughes                    throws IllegalAccessException, IllegalArgumentException,
5218da55422ed93013260c1536080b14661bfecfefbElliott Hughes                            InvocationTargetException;
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of this
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method. The format of the string is:
526f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ol>
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>modifiers (if any)
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>return type or 'void'
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>declaring class name
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>'('
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>parameter types, separated by ',' (if any)
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>')'
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *   <li>'throws' plus exception types, separated by ',' (if any)
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ol>
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * For example: {@code public native Object
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * java.lang.Method.invoke(Object,Object) throws
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IllegalAccessException,IllegalArgumentException
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ,InvocationTargetException}
541f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation for this method
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder result = new StringBuilder(Modifier.toString(getModifiers()));
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (result.length() != 0)
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result.append(' ');
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(returnType.getName());
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(' ');
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(declaringClass.getName());
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append('.');
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(name);
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append("(");
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(toString(parameterTypes));
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(")");
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (exceptionTypes != null && exceptionTypes.length != 0) {
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result.append(" throws ");
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result.append(toString(exceptionTypes));
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
562f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result.toString();
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
565f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the constructor's signature in non-printable form. This is called
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * (only) from IO native code and needed for deriving the serialVersionUID
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the class
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return The constructor's signature.
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unused")
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String getSignature() {
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder result = new StringBuilder();
576f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append('(');
5780d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        for (int i = 0; i < parameterTypes.length; i++) {
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result.append(getSignature(parameterTypes[i]));
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(')');
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append(getSignature(returnType));
583f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result.toString();
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
586f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
588