1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option) 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version. 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details. 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc., 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.classfile.util; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.List; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Utility methods for converting between internal and external representations 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of names and descriptions. 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ClassUtil 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String EMPTY_STRING = ""; 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Checks whether the given class magic number is correct. 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param magicNumber the magic number. 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @throws UnsupportedOperationException when the magic number is incorrect. 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static void checkMagicNumber(int magicNumber) throws UnsupportedOperationException 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (magicNumber != ClassConstants.MAGIC) 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new UnsupportedOperationException("Invalid magic number ["+Integer.toHexString(magicNumber)+"] in class"); 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the combined class version number. 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param majorVersion the major part of the class version number. 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param minorVersion the minor part of the class version number. 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the combined class version number. 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalClassVersion(int majorVersion, int minorVersion) 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return (majorVersion << 16) | minorVersion; 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the major part of the given class version number. 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classVersion the combined class version number. 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the major part of the class version number. 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalMajorClassVersion(int classVersion) 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return classVersion >>> 16; 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal class version number. 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classVersion the external class version number. 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal class version number. 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalMinorClassVersion(int classVersion) 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return classVersion & 0xffff; 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal class version number. 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classVersion the external class version number. 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal class version number. 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalClassVersion(String classVersion) 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return 942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_0) || 952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_1) ? ClassConstants.CLASS_VERSION_1_0 : 962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_2) ? ClassConstants.CLASS_VERSION_1_2 : 972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_3) ? ClassConstants.CLASS_VERSION_1_3 : 982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_4) ? ClassConstants.CLASS_VERSION_1_4 : 992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_5_ALIAS) || 1002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_5) ? ClassConstants.CLASS_VERSION_1_5 : 1012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_6_ALIAS) || 1022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_6) ? ClassConstants.CLASS_VERSION_1_6 : 1032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_7_ALIAS) || 1042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_7) ? ClassConstants.CLASS_VERSION_1_7 : 1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_8_ALIAS) || 1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion.equals(JavaConstants.CLASS_VERSION_1_8) ? ClassConstants.CLASS_VERSION_1_8 : 1072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 0; 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the minor part of the given class version number. 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classVersion the combined class version number. 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the minor part of the class version number. 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalClassVersion(int classVersion) 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (classVersion) 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_0: return JavaConstants.CLASS_VERSION_1_0; 1212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_2: return JavaConstants.CLASS_VERSION_1_2; 1222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_3: return JavaConstants.CLASS_VERSION_1_3; 1232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_4: return JavaConstants.CLASS_VERSION_1_4; 1242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_5: return JavaConstants.CLASS_VERSION_1_5; 1252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_6: return JavaConstants.CLASS_VERSION_1_6; 1262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_7: return JavaConstants.CLASS_VERSION_1_7; 1272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.CLASS_VERSION_1_8: return JavaConstants.CLASS_VERSION_1_8; 1282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom default: return null; 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Checks whether the given class version number is supported. 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param classVersion the combined class version number. 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @throws UnsupportedOperationException when the version is not supported. 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static void checkVersionNumbers(int classVersion) throws UnsupportedOperationException 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (classVersion < ClassConstants.CLASS_VERSION_1_0 || 1412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom classVersion > ClassConstants.CLASS_VERSION_1_8) 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 143b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang throw new UnsupportedOperationException("Unsupported class version number ["+ 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMajorClassVersion(classVersion)+"."+ 145b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang internalMinorClassVersion(classVersion)+"] (maximum "+ 1462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.CLASS_VERSION_1_8_MAJOR+"."+ 1472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.CLASS_VERSION_1_8_MINOR+", Java "+ 1482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom JavaConstants.CLASS_VERSION_1_8+")"); 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an external class name into an internal class name. 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalClassName the external class name, 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.Object</code>" 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal class name, 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalClassName(String externalClassName) 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return externalClassName.replace(JavaConstants.PACKAGE_SEPARATOR, 1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.PACKAGE_SEPARATOR); 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal class description into an external class description. 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the access flags of the class. 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal class name, 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external class description, 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public java.lang.Object</code>". 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalFullClassDescription(int accessFlags, 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalClassName) 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalClassAccessFlags(accessFlags) + 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalClassName(internalClassName); 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal class name into an external class name. 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal class name, 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external class name, 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.Object</code>". 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalClassName(String internalClassName) 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return //internalClassName.startsWith(ClassConstants.PACKAGE_JAVA_LANG) && 1932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom //internalClassName.indexOf(ClassConstants.PACKAGE_SEPARATOR, ClassConstants.PACKAGE_JAVA_LANG.length() + 1) < 0 ? 1942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom //internalClassName.substring(ClassConstants.PACKAGE_JAVA_LANG.length()) : 1952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalClassName.replace(ClassConstants.PACKAGE_SEPARATOR, 1962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom JavaConstants.PACKAGE_SEPARATOR); 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 201b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns the external base type of an external array type, dropping any 202b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * array brackets. 203b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param externalArrayType the external array type, 204b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * e.g. "<code>java.lang.Object[][]</code>" 205b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the external base type, 206b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * e.g. "<code>java.lang.Object</code>". 207b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 208b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static String externalBaseType(String externalArrayType) 209b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 2102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int index = externalArrayType.indexOf(JavaConstants.TYPE_ARRAY); 211b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return index >= 0 ? 212b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang externalArrayType.substring(0, index) : 213b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang externalArrayType; 214b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 215b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 216b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 217b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 218b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns the external short class name of an external class name, dropping 219b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * the package specification. 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalClassName the external class name, 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.Object</code>" 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external short class name, 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Object</code>". 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalShortClassName(String externalClassName) 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 2272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int index = externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR); 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalClassName.substring(index+1); 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given internal type is an array type. 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalType the internal type, 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>[[Ljava/lang/Object;</code>". 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return <code>true</code> if the given type is an array type, 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>false</code> otherwise. 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean isInternalArrayType(String internalType) 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalType.length() > 1 && 2422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType.charAt(0) == ClassConstants.TYPE_ARRAY; 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the number of dimensions of the given internal type. 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalType the internal type, 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>[[Ljava/lang/Object;</code>". 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the number of dimensions, e.g. 2. 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalArrayTypeDimensionCount(String internalType) 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int dimensions = 0; 2552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom while (internalType.charAt(dimensions) == ClassConstants.TYPE_ARRAY) 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato dimensions++; 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return dimensions; 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given internal class name is one of the interfaces 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * that is implemented by all array types. These class names are 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>java/lang/Object</code>", "<code>java/lang/Cloneable</code>", and 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>java/io/Serializable</code>" 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal class name, 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return <code>true</code> if the given type is an array interface name, 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>false</code> otherwise. 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean isInternalArrayInterfaceName(String internalClassName) 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 2762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return ClassConstants.NAME_JAVA_LANG_OBJECT.equals(internalClassName) || 2772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.NAME_JAVA_LANG_CLONEABLE.equals(internalClassName) || 2782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.NAME_JAVA_IO_SERIALIZABLE.equals(internalClassName); 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given internal type is a plain primitive type 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * (not void). 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalType the internal type, 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>I</code>". 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return <code>true</code> if the given type is a class type, 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>false</code> otherwise. 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean isInternalPrimitiveType(char internalType) 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 2922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return internalType == ClassConstants.TYPE_BOOLEAN || 2932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType == ClassConstants.TYPE_BYTE || 2942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType == ClassConstants.TYPE_CHAR || 2952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType == ClassConstants.TYPE_SHORT || 2962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType == ClassConstants.TYPE_INT || 2972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType == ClassConstants.TYPE_FLOAT || 2982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType == ClassConstants.TYPE_LONG || 2992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType == ClassConstants.TYPE_DOUBLE; 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given internal type is a primitive Category 2 type. 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalType the internal type, 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>L</code>". 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return <code>true</code> if the given type is a Category 2 type, 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>false</code> otherwise. 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean isInternalCategory2Type(String internalType) 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalType.length() == 1 && 3132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom (internalType.charAt(0) == ClassConstants.TYPE_LONG || 3142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType.charAt(0) == ClassConstants.TYPE_DOUBLE); 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given internal type is a plain class type 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * (including an array type of a plain class type). 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalType the internal type, 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Ljava/lang/Object;</code>". 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return <code>true</code> if the given type is a class type, 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>false</code> otherwise. 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean isInternalClassType(String internalType) 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int length = internalType.length(); 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return length > 1 && 3302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom// internalType.charAt(0) == ClassConstants.TYPE_CLASS_START && 3312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType.charAt(length-1) == ClassConstants.TYPE_CLASS_END; 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal type of a given class name. 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal class name, 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal type, 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Ljava/lang/Object;</code>". 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalTypeFromClassName(String internalClassName) 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalArrayTypeFromClassName(internalClassName, 0); 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal array type of a given class name with a given number 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of dimensions. If the number of dimensions is 0, the class name itself is 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * returned. 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal class name, 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param dimensionCount the number of array dimensions. 355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal array type of the array elements, 356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Ljava/lang/Object;</code>". 357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalArrayTypeFromClassName(String internalClassName, 359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int dimensionCount) 360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer buffer = new StringBuffer(internalClassName.length() + dimensionCount + 2); 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int dimension = 0; dimension < dimensionCount; dimension++) 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 3652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom buffer.append(ClassConstants.TYPE_ARRAY); 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return buffer.append(ClassConstants.TYPE_CLASS_START) 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato .append(internalClassName) 3702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom .append(ClassConstants.TYPE_CLASS_END) 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato .toString(); 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal element type of a given internal array type. 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalArrayType the internal array type, 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>[[Ljava/lang/Object;</code>" or 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>[I</code>". 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal type of the array elements, 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Ljava/lang/Object;</code>" or 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>I</code>". 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalTypeFromArrayType(String internalArrayType) 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 3862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int index = internalArrayType.lastIndexOf(ClassConstants.TYPE_ARRAY); 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalArrayType.substring(index+1); 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal class name of a given internal class type 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * (including an array type). Types involving primitive types are returned 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * unchanged. 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassType the internal class type, 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>[Ljava/lang/Object;</code>", 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>Ljava/lang/Object;</code>", or 398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>java/lang/Object</code>". 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal class name, 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalClassNameFromClassType(String internalClassType) 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return isInternalClassType(internalClassType) ? 4052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalClassType.substring(internalClassType.indexOf(ClassConstants.TYPE_CLASS_START)+1, 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalClassType.length()-1) : 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalClassType; 408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal class name of any given internal descriptor type, 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * disregarding array prefixes. 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassType the internal class type, 415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Ljava/lang/Object;</code>" or 416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>[[I</code>". 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal class name, 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>" or 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>null</code>. 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalClassNameFromType(String internalClassType) 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!isInternalClassType(internalClassType)) 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return null; 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Is it an array type? 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (isInternalArrayType(internalClassType)) 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalClassType = internalTypeFromArrayType(internalClassType); 432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalClassNameFromClassType(internalClassType); 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 439b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns whether the given method name refers to a class initializer or 440b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * an instance initializer. 441b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param internalMethodName the internal method name, 442b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * e.g. "<code><clinit></code>". 443b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return whether the method name refers to an initializer, 444b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * e.g. <code>true</code>. 445b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 446b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static boolean isInitializer(String internalMethodName) 447b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 4482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return internalMethodName.equals(ClassConstants.METHOD_NAME_CLINIT) || 4492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalMethodName.equals(ClassConstants.METHOD_NAME_INIT); 450b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 451b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 452b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 453b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal type of the given internal method descriptor. 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal return type, 458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Z</code>". 459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalMethodReturnType(String internalMethodDescriptor) 461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 4622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int index = internalMethodDescriptor.indexOf(ClassConstants.METHOD_ARGUMENTS_CLOSE); 463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalMethodDescriptor.substring(index + 1); 464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the number of parameters of the given internal method descriptor. 469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(ID)Z</code>". 471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the number of parameters, 472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. 2. 473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalMethodParameterCount(String internalMethodDescriptor) 475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int counter = 0; 4772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int index = 1; 478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom while (true) 4802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 4812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom char c = internalMethodDescriptor.charAt(index++); 4822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom switch (c) 4832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 4842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_ARRAY: 4852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 4862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Just ignore all array characters. 4872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 4882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 4892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_CLASS_START: 4902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 4912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom counter++; 4922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 4932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip the class name. 4942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; 4952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 4962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 4972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom default: 4982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 4992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom counter++; 5002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 5012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 5022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.METHOD_ARGUMENTS_CLOSE: 5032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 5042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return counter; 5052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 5062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the size taken up on the stack by the parameters of the given 513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * internal method descriptor. This accounts for long and double parameters 514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * taking up two entries. 515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(ID)Z</code>". 517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the size taken up on the stack, 518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. 3. 519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalMethodParameterSize(String internalMethodDescriptor) 521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalMethodParameterSize(internalMethodDescriptor, true); 523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the size taken up on the stack by the parameters of the given 528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * internal method descriptor. This accounts for long and double parameters 529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * taking up two entries, and a non-static method taking up an additional 530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * entry. 531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(ID)Z</code>". 533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the access flags of the method, 534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. 0. 535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the size taken up on the stack, 536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. 4. 537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalMethodParameterSize(String internalMethodDescriptor, 539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int accessFlags) 540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalMethodParameterSize(internalMethodDescriptor, 5422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom (accessFlags & ClassConstants.ACC_STATIC) != 0); 543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the size taken up on the stack by the parameters of the given 548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * internal method descriptor. This accounts for long and double parameters 549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * taking up two spaces, and a non-static method taking up an additional 550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * entry. 551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(ID)Z</code>". 553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param isStatic specifies whether the method is static, 554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. false. 555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the size taken up on the stack, 556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. 4. 557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalMethodParameterSize(String internalMethodDescriptor, 559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean isStatic) 560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 5612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int size = isStatic ? 0 : 1; 5622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int index = 1; 563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 5642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom while (true) 565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 5662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom char c = internalMethodDescriptor.charAt(index++); 5672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom switch (c) 5682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 5692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_LONG: 5702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_DOUBLE: 5712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 5722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom size += 2; 5732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 5742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 5752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_CLASS_START: 5762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 5772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom size++; 5782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 5792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip the class name. 5802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; 5812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 5822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 5832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_ARRAY: 5842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 5852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom size++; 5862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 5872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip all array characters. 5882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom while ((c = internalMethodDescriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {} 5892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 5902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (c == ClassConstants.TYPE_CLASS_START) 5912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 5922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip the class type. 5932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom index = internalMethodDescriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; 5942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 5952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 5962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 5972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom default: 5982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 5992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom size++; 6002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 6012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 6022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.METHOD_ARGUMENTS_CLOSE: 6032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 6042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return size; 6052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 6062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the size taken up on the stack by the given internal type. 613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * The size is 1, except for long and double types, for which it is 2, 614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * and for the void type, for which 0 is returned. 615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalType the internal type, 616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>I</code>". 617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the size taken up on the stack, 618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. 1. 619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int internalTypeSize(String internalType) 621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (internalType.length() == 1) 623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato char internalPrimitiveType = internalType.charAt(0); 6252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (internalPrimitiveType == ClassConstants.TYPE_LONG || 6262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalPrimitiveType == ClassConstants.TYPE_DOUBLE) 627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return 2; 629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 6302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom else if (internalPrimitiveType == ClassConstants.TYPE_VOID) 631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return 0; 633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return 1; 637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an external type into an internal type. 642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalType the external type, 643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.Object[][]</code>" or 644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>int[]</code>". 645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal type, 646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>[[Ljava/lang/Object;</code>" or 647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>[I</code>". 648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalType(String externalType) 650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Strip the array part, if any. 652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int dimensionCount = externalArrayTypeDimensionCount(externalType); 653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (dimensionCount > 0) 654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 6552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType = externalType.substring(0, externalType.length() - dimensionCount * JavaConstants.TYPE_ARRAY.length()); 656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Analyze the actual type part. 659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato char internalTypeChar = 6602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_VOID ) ? ClassConstants.TYPE_VOID : 6612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_BOOLEAN) ? ClassConstants.TYPE_BOOLEAN : 6622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_BYTE ) ? ClassConstants.TYPE_BYTE : 6632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_CHAR ) ? ClassConstants.TYPE_CHAR : 6642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_SHORT ) ? ClassConstants.TYPE_SHORT : 6652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_INT ) ? ClassConstants.TYPE_INT : 6662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_FLOAT ) ? ClassConstants.TYPE_FLOAT : 6672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_LONG ) ? ClassConstants.TYPE_LONG : 6682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals(JavaConstants.TYPE_DOUBLE ) ? ClassConstants.TYPE_DOUBLE : 6692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType.equals("%" ) ? '%' : 6702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom (char)0; 671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalType = 673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalTypeChar != 0 ? String.valueOf(internalTypeChar) : 6742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.TYPE_CLASS_START + 675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalClassName(externalType) + 6762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassConstants.TYPE_CLASS_END; 677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Prepend the array part, if any. 679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int count = 0; count < dimensionCount; count++) 680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 6812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalType = ClassConstants.TYPE_ARRAY + internalType; 682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalType; 685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the number of dimensions of the given external type. 690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalType the external type, 691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>[[Ljava/lang/Object;</code>". 692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the number of dimensions, e.g. 2. 693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static int externalArrayTypeDimensionCount(String externalType) 695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int dimensions = 0; 6972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int length = JavaConstants.TYPE_ARRAY.length(); 698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int offset = externalType.length() - length; 699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato while (externalType.regionMatches(offset, 7002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom JavaConstants.TYPE_ARRAY, 701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, 702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato length)) 703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato dimensions++; 705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato offset -= length; 706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return dimensions; 709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal type into an external type. 714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalType the internal type, 715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>[[Ljava/lang/Object;</code>" or 716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>[I</code>". 717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external type, 718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.Object[][]</code>" or 719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>int[]</code>". 720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalType(String internalType) 722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Strip the array part, if any. 724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int dimensionCount = internalArrayTypeDimensionCount(internalType); 725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (dimensionCount > 0) 726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalType = internalType.substring(dimensionCount); 728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Analyze the actual type part. 731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato char internalTypeChar = internalType.charAt(0); 732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String externalType = 7342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_VOID ? JavaConstants.TYPE_VOID : 7352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_BOOLEAN ? JavaConstants.TYPE_BOOLEAN : 7362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_BYTE ? JavaConstants.TYPE_BYTE : 7372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_CHAR ? JavaConstants.TYPE_CHAR : 7382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_SHORT ? JavaConstants.TYPE_SHORT : 7392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_INT ? JavaConstants.TYPE_INT : 7402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_FLOAT ? JavaConstants.TYPE_FLOAT : 7412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_LONG ? JavaConstants.TYPE_LONG : 7422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_DOUBLE ? JavaConstants.TYPE_DOUBLE : 7432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == '%' ? "%" : 7442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalTypeChar == ClassConstants.TYPE_CLASS_START ? externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.TYPE_CLASS_END))) : 7452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom null; 746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (externalType == null) 748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Unknown type ["+internalType+"]"); 750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Append the array part, if any. 753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int count = 0; count < dimensionCount; count++) 754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 7552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalType += JavaConstants.TYPE_ARRAY; 756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalType; 759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given internal descriptor String represents a method 764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * descriptor. 765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalDescriptor the internal descriptor String, 766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return <code>true</code> if the given String is a method descriptor, 768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>false</code> otherwise. 769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean isInternalMethodDescriptor(String internalDescriptor) 771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 7722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return internalDescriptor.charAt(0) == ClassConstants.METHOD_ARGUMENTS_OPEN; 773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given member String represents an external method 778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * name with arguments. 779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalMemberNameAndArguments the external member String, 780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>myField</code>" or 781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>myMethod(int,int)</code>". 782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return <code>true</code> if the given String refers to a method, 783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * <code>false</code> otherwise. 784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean isExternalMethodNameAndArguments(String externalMemberNameAndArguments) 786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 7872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return externalMemberNameAndArguments.indexOf(JavaConstants.METHOD_ARGUMENTS_OPEN) > 0; 788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the name part of the given external method name and arguments. 793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalMethodNameAndArguments the external method name and arguments, 794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>myMethod(int,int)</code>". 795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the name part of the String, e.g. "<code>myMethod</code>". 796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalMethodName(String externalMethodNameAndArguments) 798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ExternalTypeEnumeration externalTypeEnumeration = 800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ExternalTypeEnumeration(externalMethodNameAndArguments); 801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalTypeEnumeration.methodName(); 803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts the given external method return type and name and arguments to 808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * an internal method descriptor. 809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalReturnType the external method return type, 810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>boolean</code>". 811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalMethodNameAndArguments the external method name and arguments, 812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>myMethod(int,int)</code>". 813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal method descriptor, 814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalMethodDescriptor(String externalReturnType, 817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String externalMethodNameAndArguments) 818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer internalMethodDescriptor = new StringBuffer(); 8202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); 821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ExternalTypeEnumeration externalTypeEnumeration = 823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ExternalTypeEnumeration(externalMethodNameAndArguments); 824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato while (externalTypeEnumeration.hasMoreTypes()) 826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMethodDescriptor.append(internalType(externalTypeEnumeration.nextType())); 828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 8302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); 831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMethodDescriptor.append(internalType(externalReturnType)); 832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalMethodDescriptor.toString(); 834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts the given external method return type and List of arguments to 839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * an internal method descriptor. 840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalReturnType the external method return type, 841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>boolean</code>". 842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalArguments the external method arguments, 843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. <code>{ "int", "int" }</code>. 844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal method descriptor, 845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalMethodDescriptor(String externalReturnType, 848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List externalArguments) 849b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer internalMethodDescriptor = new StringBuffer(); 8512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_OPEN); 852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < externalArguments.size(); index++) 854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMethodDescriptor.append(internalType((String)externalArguments.get(index))); 856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 8582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom internalMethodDescriptor.append(ClassConstants.METHOD_ARGUMENTS_CLOSE); 859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMethodDescriptor.append(internalType(externalReturnType)); 860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return internalMethodDescriptor.toString(); 862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal field description into an external full field description. 867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the access flags of the field. 868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param fieldName the field name, 869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>myField</code>". 870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalFieldDescriptor the internal field descriptor, 871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>Z</code>". 872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external full field description, 873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public boolean myField</code>". 874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalFullFieldDescription(int accessFlags, 876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String fieldName, 877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalFieldDescriptor) 878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalFieldAccessFlags(accessFlags) + 880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalType(internalFieldDescriptor) + 881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ' ' + 882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fieldName; 883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal method description into an external full method description. 888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal name of the class of the method, 889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>mypackage/MyClass</code>". 890b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the access flags of the method. 891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodName the internal method name, 892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>myMethod</code>" or 893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code><init></code>". 894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external full method description, 897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public boolean myMethod(int,int)</code>" or 898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>public MyClass(int,int)</code>". 899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 900b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalFullMethodDescription(String internalClassName, 901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int accessFlags, 902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalMethodName, 903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalMethodDescriptor) 904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalMethodAccessFlags(accessFlags) + 906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalMethodReturnTypeAndName(internalClassName, 907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMethodName, 908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMethodDescriptor) + 9092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom JavaConstants.METHOD_ARGUMENTS_OPEN + 910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalMethodArguments(internalMethodDescriptor) + 9112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom JavaConstants.METHOD_ARGUMENTS_CLOSE; 912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts internal class access flags into an external access description. 917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the class access flags. 918b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external class access description, 919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public final </code>". 920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 921b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalClassAccessFlags(int accessFlags) 922b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 923b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalClassAccessFlags(accessFlags, ""); 924b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 925b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 926b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 927b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 928b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts internal class access flags into an external access description. 929b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the class access flags. 930b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param prefix a prefix that is added to each access modifier. 931b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external class access description, 932b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public final </code>". 933b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 934b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalClassAccessFlags(int accessFlags, String prefix) 935b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 936b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (accessFlags == 0) 937b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 938b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return EMPTY_STRING; 939b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 940b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 941b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer string = new StringBuffer(50); 942b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 9432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) 944b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 9452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); 946b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 9472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) 948b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 949b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Only in InnerClasses attributes. 9502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); 951b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 9522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) 953b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 954b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Only in InnerClasses attributes. 9552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); 956b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 9572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_STATIC) != 0) 958b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 959b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Only in InnerClasses attributes. 9602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); 961b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 9622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_FINAL) != 0) 963b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 9642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); 965b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 9662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_ANNOTATTION) != 0) 967b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 9682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_ANNOTATION); 969b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 9702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_INTERFACE) != 0) 971b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 9722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_INTERFACE).append(' '); 973b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 9742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom else if ((accessFlags & ClassConstants.ACC_ENUM) != 0) 975b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 9762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_ENUM).append(' '); 977b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 9782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom else if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) 979b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 9802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); 981b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 9822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom else if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) 983b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 9842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); 985b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 986b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 987b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return string.toString(); 988b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 989b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 990b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 991b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 992b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts internal field access flags into an external access description. 993b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the field access flags. 994b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external field access description, 995b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public volatile </code>". 996b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 997b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalFieldAccessFlags(int accessFlags) 998b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 999b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalFieldAccessFlags(accessFlags, ""); 1000b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1001b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1002b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1003b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1004b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts internal field access flags into an external access description. 1005b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the field access flags. 1006b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param prefix a prefix that is added to each access modifier. 1007b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external field access description, 1008b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public volatile </code>". 1009b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1010b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalFieldAccessFlags(int accessFlags, String prefix) 1011b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1012b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (accessFlags == 0) 1013b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1014b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return EMPTY_STRING; 1015b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1016b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1017b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer string = new StringBuffer(50); 1018b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 10192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) 1020b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 10212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); 1022b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 10232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) 1024b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 10252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); 1026b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 10272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) 1028b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 10292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); 1030b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 10312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_STATIC) != 0) 1032b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 10332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); 1034b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 10352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_FINAL) != 0) 1036b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 10372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); 1038b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 10392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_VOLATILE) != 0) 1040b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 10412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_VOLATILE).append(' '); 1042b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 10432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_TRANSIENT) != 0) 1044b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 10452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_TRANSIENT).append(' '); 1046b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 10472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) 1048b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 10492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); 1050b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 1051b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1052b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return string.toString(); 1053b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1054b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1055b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1056b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1057b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts internal method access flags into an external access description. 1058b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the method access flags. 1059b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external method access description, 1060b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>public synchronized </code>". 1061b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1062b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalMethodAccessFlags(int accessFlags) 1063b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1064b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalMethodAccessFlags(accessFlags, ""); 1065b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1066b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1067b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1068b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1069b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts internal method access flags into an external access description. 1070b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param accessFlags the method access flags. 1071b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param prefix a prefix that is added to each access modifier. 1072b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external method access description, 1073b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "public synchronized ". 1074b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1075b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalMethodAccessFlags(int accessFlags, String prefix) 1076b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1077b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (accessFlags == 0) 1078b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1079b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return EMPTY_STRING; 1080b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1081b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1082b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer string = new StringBuffer(50); 1083b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 10842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PUBLIC) != 0) 10852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 10862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PUBLIC).append(' '); 10872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 10882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PRIVATE) != 0) 10892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 10902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PRIVATE).append(' '); 10912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 10922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_PROTECTED) != 0) 10932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 10942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_PROTECTED).append(' '); 10952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 10962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_STATIC) != 0) 10972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 10982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_STATIC).append(' '); 10992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 11002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_FINAL) != 0) 1101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); 1103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_SYNCHRONIZED) != 0) 1105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_SYNCHRONIZED).append(' '); 1107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_BRIDGE) != 0) 1109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_BRIDGE).append(' '); 1111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_VARARGS) != 0) 1113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_VARARGS).append(' '); 1115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_NATIVE) != 0) 1117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_NATIVE).append(' '); 1119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_ABSTRACT) != 0) 1121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_ABSTRACT).append(' '); 1123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_STRICT) != 0) 1125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 11262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_STRICT).append(' '); 1127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 11282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) 1129b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 11302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); 1131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 11322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 11332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return string.toString(); 11342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 11352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 11362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 11372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 11382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Converts internal method parameter access flags into an external access 11392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * description. 11402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @param accessFlags the method parameter access flags. 11412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @return the external method parameter access description, 11422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * e.g. "<code>final mandated </code>". 11432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 11442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public static String externalParameterAccessFlags(int accessFlags) 11452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 11462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return externalParameterAccessFlags(accessFlags, ""); 11472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 11482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 11492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 11502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 11512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Converts internal method parameter access flags into an external access 11522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * description. 11532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @param accessFlags the method parameter access flags. 11542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @param prefix a prefix that is added to each access modifier. 11552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @return the external method parameter access description, 11562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * e.g. "final mandated ". 11572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 11582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public static String externalParameterAccessFlags(int accessFlags, String prefix) 11592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 11602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (accessFlags == 0) 1161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return EMPTY_STRING; 1163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 11652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom StringBuffer string = new StringBuffer(50); 11662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 11672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_FINAL) != 0) 1168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_FINAL).append(' '); 1170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_SYNTHETIC) != 0) 1172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 11732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_SYNTHETIC).append(' '); 1174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 11752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((accessFlags & ClassConstants.ACC_MANDATED) != 0) 1176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 11772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom string.append(prefix).append(JavaConstants.ACC_MANDATED).append(' '); 1178b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 1179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return string.toString(); 1181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal method descriptor into an external method return type. 1186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 1187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 1188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external method return type, 1189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>boolean</code>". 1190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalMethodReturnType(String internalMethodDescriptor) 1192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalType(internalMethodReturnType(internalMethodDescriptor)); 1194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal class name, method name, and method descriptor to 1199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * an external method return type and name. 1200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal name of the class of the method, 1201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>mypackage/MyClass</code>". 1202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodName the internal method name, 1203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>myMethod</code>" or 1204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code><init></code>". 1205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 1206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 1207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external method return type and name, 1208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>boolean myMethod</code>" or 1209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * "<code>MyClass</code>". 1210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static String externalMethodReturnTypeAndName(String internalClassName, 1212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalMethodName, 1213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalMethodDescriptor) 1214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 12152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return internalMethodName.equals(ClassConstants.METHOD_NAME_INIT) ? 1216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalShortClassName(externalClassName(internalClassName)) : 1217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (externalMethodReturnType(internalMethodDescriptor) + 1218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ' ' + 1219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalMethodName); 1220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Converts an internal method descriptor into an external method argument 1225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * description. 1226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalMethodDescriptor the internal method descriptor, 1227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>(II)Z</code>". 1228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external method argument description, 1229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>int,int</code>". 1230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalMethodArguments(String internalMethodDescriptor) 1232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer externalMethodNameAndArguments = new StringBuffer(); 1234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato InternalTypeEnumeration internalTypeEnumeration = 1236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new InternalTypeEnumeration(internalMethodDescriptor); 1237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato while (internalTypeEnumeration.hasMoreTypes()) 1239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalMethodNameAndArguments.append(externalType(internalTypeEnumeration.nextType())); 1241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (internalTypeEnumeration.hasMoreTypes()) 1242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 12432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom externalMethodNameAndArguments.append(JavaConstants.METHOD_ARGUMENTS_SEPARATOR); 1244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return externalMethodNameAndArguments.toString(); 1248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal package name of the given internal class name. 1253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal class name, 1254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 1255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal package name, 1256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang</code>". 1257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalPackageName(String internalClassName) 1259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String internalPackagePrefix = internalPackagePrefix(internalClassName); 1261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int length = internalPackagePrefix.length(); 1262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return length > 0 ? 1263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalPackagePrefix.substring(0, length - 1) : 1264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ""; 1265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the internal package prefix of the given internal class name. 1270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param internalClassName the internal class name, 1271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/Object</code>". 1272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the internal package prefix, 1273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java/lang/</code>". 1274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String internalPackagePrefix(String internalClassName) 1276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 12772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return internalClassName.substring(0, internalClassName.lastIndexOf(ClassConstants.PACKAGE_SEPARATOR, 1278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato internalClassName.length() - 2) + 1); 1279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the external package name of the given external class name. 1284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalClassName the external class name, 1285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.Object</code>". 1286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external package name, 1287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang</code>". 1288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalPackageName(String externalClassName) 1290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String externalPackagePrefix = externalPackagePrefix(externalClassName); 1292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int length = externalPackagePrefix.length(); 1293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return length > 0 ? 1294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalPackagePrefix.substring(0, length - 1) : 1295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ""; 1296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the external package prefix of the given external class name. 1301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param externalClassName the external class name, 1302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.Object</code>". 1303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return the external package prefix, 1304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * e.g. "<code>java.lang.</code>". 1305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static String externalPackagePrefix(String externalClassName) 1307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 13082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return externalClassName.substring(0, externalClassName.lastIndexOf(JavaConstants.PACKAGE_SEPARATOR, 1309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato externalClassName.length() - 2) + 1); 1310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 1312