1e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom/* 2e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * Copyright (C) 2011 The Android Open Source Project 3e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * 4e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * you may not use this file except in compliance with the License. 6e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * You may obtain a copy of the License at 7e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * 8e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * 10e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 11e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * See the License for the specific language governing permissions and 14e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * limitations under the License. 15e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom */ 16e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 17e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrompackage libcore.reflect; 18e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 19e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstromimport java.lang.reflect.Array; 20e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 21e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom/** 22e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * Work with a type's internal name like "V" or "Ljava/lang/String;". 23e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom */ 24e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrompublic final class InternalNames { 25e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom private InternalNames() { 26e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 27e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 28e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom public static Class<?> getClass(ClassLoader classLoader, String internalName) { 29e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom if (internalName.startsWith("[")) { 30e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom Class<?> componentClass = getClass(classLoader, internalName.substring(1)); 31e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return Array.newInstance(componentClass, 0).getClass(); 32e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("Z")) { 33e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return boolean.class; 34e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("B")) { 35e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return byte.class; 36e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("S")) { 37e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return short.class; 38e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("I")) { 39e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return int.class; 40e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("J")) { 41e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return long.class; 42e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("F")) { 43e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return float.class; 44e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("D")) { 45e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return double.class; 46e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("C")) { 47e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return char.class; 48e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (internalName.equals("V")) { 49e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return void.class; 50e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else { 51e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom String name = internalName.substring(1, internalName.length() - 1).replace('/', '.'); 52e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom try { 53e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return classLoader.loadClass(name); 54e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } catch (ClassNotFoundException e) { 55e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom NoClassDefFoundError error = new NoClassDefFoundError(name); 56e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom error.initCause(e); 57e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom throw error; 58e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 59e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 60e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 61e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 62e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom public static String getInternalName(Class<?> c) { 63e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom if (c.isArray()) { 64e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return '[' + getInternalName(c.getComponentType()); 65e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == boolean.class) { 66e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "Z"; 67e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == byte.class) { 68e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "B"; 69e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == short.class) { 70e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "S"; 71e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == int.class) { 72e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "I"; 73e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == long.class) { 74e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "J"; 75e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == float.class) { 76e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "F"; 77e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == double.class) { 78e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "D"; 79e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == char.class) { 80e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "C"; 81e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else if (c == void.class) { 82e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return "V"; 83e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } else { 84e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return 'L' + c.getName().replace('.', '/') + ';'; 85e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 86e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 87e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom} 88