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