1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership. 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License. You may obtain a copy of the License at 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.lang.reflect; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.annotation.Annotation; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Hashtable; 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.kernel.vm.StringUtils; 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.kernel.vm.ReflectionAccess; 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code AccessibleObject} is the superclass of all member reflection classes 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (Field, Constructor, Method). AccessibleObject provides the ability to toggle 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a flag controlling access checks for these objects. By default, accessing a 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * member (for example, setting a field or invoking a method) checks the 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * validity of the access (for example, invoking a private method from outside 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the defining class is prohibited) and throws IllegalAccessException if the 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * operation is not permitted. If the accessible flag is set to true, these 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * checks are omitted. This allows privileged code, such as Java object 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * serialization, object inspectors, and debuggers to have complete access to 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * objects. 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Field 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Constructor 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Method 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see ReflectPermission 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class AccessibleObject implements AnnotatedElement { 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // If true, object is accessible, bypassing normal security checks 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean flag = false; 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * one dimensional array 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final String DIMENSION_1 = "[]"; 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * two dimensional array 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final String DIMENSION_2 = "[][]"; 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * three dimensional array 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final String DIMENSION_3 = "[][][]"; 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Holds a mapping from Java type names to native type codes. 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static Hashtable<String, String> trans; 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static { 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans = new Hashtable<String, String>(9); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("byte", "B"); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("char", "C"); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("short", "S"); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("int", "I"); 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("long", "J"); 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("float", "F"); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("double", "D"); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("void", "V"); 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project trans.put("boolean", "Z"); 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempts to set the value of the accessible flag for all the objects in 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the array provided. Only one security check is performed. Setting this 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * flag to {@code false} will enable access checks, setting to {@code true} 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * will disable them. If there is a security manager, checkPermission is 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * called with a {@code ReflectPermission("suppressAccessChecks")}. 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param objects 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the accessible objects 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param flag 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the new value for the accessible flag 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws SecurityException 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the request is denied 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see #setAccessible(boolean) 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see ReflectPermission 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void setAccessible(AccessibleObject[] objects, boolean flag) 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws SecurityException { 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SecurityManager smgr = System.getSecurityManager(); 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (smgr != null) { 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project smgr.checkPermission(new ReflectPermission("suppressAccessChecks")); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized(AccessibleObject.class) { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < objects.length; i++) { 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project objects[i].flag = flag; 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs a new {@code AccessibleObject} instance. {@code 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AccessibleObject} instances can only be constructed by the virtual 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * machine. 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected AccessibleObject() { 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(); 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Indicates whether this object is accessible without security checks being 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * performed. Returns the accessible flag. 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return {@code true} if this object is accessible without security 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * checks, {@code false} otherwise 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean isAccessible() { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return flag; 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempts to set the value of the accessible flag. Setting this flag to 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code false} will enable access checks, setting to {@code true} will 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * disable them. If there is a security manager, checkPermission is called 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with a {@code ReflectPermission("suppressAccessChecks")}. 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param flag 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the new value for the accessible flag 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws SecurityException 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the request is denied 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see ReflectPermission 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void setAccessible(boolean flag) throws SecurityException { 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SecurityManager smgr = System.getSecurityManager(); 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (smgr != null) { 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project smgr.checkPermission(new ReflectPermission("suppressAccessChecks")); 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.flag = flag; 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sets the accessible flag on this instance without doing any checks. 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param flag 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the new value for the accessible flag 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /*package*/ void setAccessibleNoCheck(boolean flag) { 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.flag = flag; 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) { 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getAnnotation(annotationType) != null; 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Annotation[] getDeclaredAnnotations() { 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("subclass must override this method"); 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Annotation[] getAnnotations() { 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // for all but Class, getAnnotations == getDeclaredAnnotations 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getDeclaredAnnotations(); 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* slow, but works for all sub-classes */ 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public <T extends Annotation> T getAnnotation(Class<T> annotationType) { 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotationType == null) { 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException(); 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotation[] annos = getAnnotations(); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = annos.length-1; i >= 0; --i) { 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annos[i].annotationType() == annotationType) { 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (T) annos[i]; 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the signature for a class. This is the kind of signature used 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * internally by the JVM, with one-character codes representing the basic 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * types. It is not suitable for printing. 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param clazz 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the class for which a signature is required 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return The signature as a string 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String getSignature(Class<?> clazz) { 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String result = ""; 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String nextType = clazz.getName(); 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if(trans.containsKey(nextType)) { 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = trans.get(nextType); 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if(clazz.isArray()) { 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = "[" + getSignature(clazz.getComponentType()); 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = "L" + nextType + ";"; 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns a printable String consisting of the canonical names of the 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * classes contained in an array. The form is that used in parameter and 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception lists, that is, the class or type names are separated by 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * commas. 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param types 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the array of classes 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return The String of names 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String toString(Class<?>[] types) { 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StringBuilder result = new StringBuilder(); 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (types.length != 0) { 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.append(types[0].getCanonicalName()); 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 1; i < types.length; i++) { 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.append(','); 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.append(types[i].getCanonicalName()); 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result.toString(); 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the Signature attribute for this instance. Returns {@code null} 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if not found. 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /*package*/ String getSignatureAttribute() { 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: This method would have been declared abstract, but the 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * standard API lists this class as concrete. 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new UnsupportedOperationException(); 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Retrieve the signature attribute from an arbitrary class. This is 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the same as Class.getSignatureAttribute(), but it can be used from 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the java.lang.reflect package. 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /*package*/ static String getClassSignatureAttribute(Class clazz) { 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object[] annotation = getClassSignatureAnnotation(clazz); 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotation == null) { 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return StringUtils.combineStrings(annotation); 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Retrieve the signature annotation from an arbitrary class. This is 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the same as Class.getSignatureAttribute(), but it can be used from 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the java.lang.reflect package. 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static native Object[] getClassSignatureAnnotation(Class clazz); 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the unique instance of {@link ReflectionAccessImpl}. 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return non-null; the unique instance 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static /*package*/ ReflectionAccess getReflectionAccess() { 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ReflectionAccessImpl.THE_ONE; 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Appends the specified class name to the buffer. The class may represent 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a simple type, a reference type or an array type. 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param sb buffer 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param obj the class which name should be appended to the buffer 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws NullPointerException if any of the arguments is null 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void appendArrayType(StringBuilder sb, Class<?> obj) { 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!obj.isArray()) { 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(obj.getName()); 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return; 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int dimensions = 1; 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Class simplified = obj.getComponentType(); 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project obj = simplified; 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (simplified.isArray()) { 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project obj = simplified; 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dimensions++; 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(obj.getName()); 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (dimensions) { 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 1: 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(DIMENSION_1); 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 2: 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(DIMENSION_2); 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case 3: 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(DIMENSION_3); 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (; dimensions > 0; dimensions--) { 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(DIMENSION_1); 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Appends names of the specified array classes to the buffer. The array 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements may represent a simple type, a reference type or an array type. 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Output format: java.lang.Object[], java.io.File, void 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param sb buffer 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param objs array of classes to print the names 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws NullPointerException if any of the arguments is null 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void appendArrayType(StringBuilder sb, Class[] objs) { 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (objs.length > 0) { 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project appendArrayType(sb, objs[0]); 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 1; i < objs.length; i++) { 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(','); 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project appendArrayType(sb, objs[i]); 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Appends names of the specified array classes to the buffer. The array 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements may represent a simple type, a reference type or an array type. 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Output format: java.lang.Object[], java.io.File, void 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param sb buffer 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param objs array of classes to print the names 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws NullPointerException if any of the arguments is null 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void appendArrayGenericType(StringBuilder sb, Type[] objs) { 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (objs.length > 0) { 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project appendGenericType(sb, objs[0]); 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 1; i < objs.length; i++) { 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(','); 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project appendGenericType(sb, objs[i]); 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Appends the generic type representation to the buffer. 392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param sb buffer 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param obj the generic type which representation should be appended to the buffer 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws NullPointerException if any of the arguments is null 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void appendGenericType(StringBuilder sb, Type obj) { 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj instanceof TypeVariable) { 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(((TypeVariable)obj).getName()); 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (obj instanceof ParameterizedType) { 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(obj.toString()); 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (obj instanceof GenericArrayType) { //XXX: is it a working branch? 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Type simplified = ((GenericArrayType)obj).getGenericComponentType(); 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project appendGenericType(sb, simplified); 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("[]"); 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (obj instanceof Class) { 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Class c = ((Class<?>)obj); 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (c.isArray()){ 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String as[] = c.getName().split("\\["); 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = as.length-1; 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (as[len].length() > 1){ 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(as[len].substring(1, as[len].length()-1)); 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char ch = as[len].charAt(0); 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (ch == 'I') 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("int"); 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'B') 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("byte"); 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'J') 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("long"); 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'F') 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("float"); 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'D') 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("double"); 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'S') 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("short"); 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'C') 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("char"); 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'Z') 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("boolean"); 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else if (ch == 'V') //XXX: is it a working branch? 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("void"); 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < len; i++){ 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append("[]"); 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(c.getName()); 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Appends names of the specified array classes to the buffer. The array 446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * elements may represent a simple type, a reference type or an array type. 447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In case if the specified array element represents an array type its 448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * internal will be appended to the buffer. 449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Output format: [Ljava.lang.Object;, java.io.File, void 450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param sb buffer 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param objs array of classes to print the names 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws NullPointerException if any of the arguments is null 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void appendSimpleType(StringBuilder sb, Class<?>[] objs) { 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (objs.length > 0) { 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(objs[0].getName()); 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 1; i < objs.length; i++) { 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(','); 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sb.append(objs[i].getName()); 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 466