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