]> source.dussan.org Git - javassist.git/commitdiff
added ClassPool.getCtClass() and fixed related bugs.
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 4 Jul 2008 09:17:50 +0000 (09:17 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 4 Jul 2008 09:17:50 +0000 (09:17 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@449 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/ClassPool.java
src/main/javassist/CtClass.java
src/main/javassist/bytecode/ConstPool.java
src/main/javassist/bytecode/Descriptor.java
src/main/javassist/expr/Cast.java
src/main/javassist/expr/Handler.java
src/main/javassist/expr/Instanceof.java

index 3bab74ae38acb42e55d17d4d7d7fb1e785af569c..2db2009a22afd0f66fdf70577638c2efbb97e6bd 100644 (file)
@@ -440,6 +440,33 @@ public class ClassPool {
         }
     }
 
+    /**
+     * Returns a <code>CtClass</code> object with the given name.
+     * This is almost equivalent to <code>get(String)</code> except
+     * that classname can be an array-type "descriptor" (an encoded
+     * type name) such as <code>[Ljava/lang/Object;</code>.
+     *
+     * <p>Using this method is not recommended; this method should be 
+     * used only to obtain the <code>CtClass</code> object
+     * with a name returned from <code>getClassInfo</code> in
+     * <code>javassist.bytecode.ClassPool</code>.  <code>getClassInfo</code>
+     * returns a fully-qualified class name but, if the class is an array
+     * type, it returns a descriptor.
+     *
+     * @param classname         a fully-qualified class name or a descriptor
+     *                          representing an array type.
+     * @see #get(String)
+     * @see javassist.bytecode.ConstPool#getClassInfo(int)
+     * @see javassist.bytecode.Descriptor#toCtClass(String, ClassPool)
+     * @since 3.8.1
+     */
+    public CtClass getCtClass(String classname) throws NotFoundException {
+        if (classname.charAt(0) == '[')
+            return Descriptor.toCtClass(classname, this);
+        else
+            return get(classname);
+    }
+
     /**
      * @param useCache      false if the cached CtClass must be ignored.
      * @param searchParent  false if the parent class pool is not searched.
@@ -463,8 +490,9 @@ public class ClassPool {
 
         clazz = createCtClass(classname, useCache);
         if (clazz != null) {
+            // clazz.getName() != classname if classname is "[L<name>;".
             if (useCache)
-                cacheCtClass(classname, clazz, false);
+                cacheCtClass(clazz.getName(), clazz, false);
 
             return clazz;
         }
index 1666c71dd46e2aaf225c818be4cd6ed7ef033f40..554b89234fe7f89d114a39aa98290c4ee2d69460 100644 (file)
@@ -52,7 +52,7 @@ public abstract class CtClass {
     /**
      * The version number of this release.
      */
-    public static final String version = "3.8.0.GA";
+    public static final String version = "3.8.1.GA";
 
     /**
      * Prints the version number and the copyright notice.
index 7ac8dc2fb1a41dc4729eae5f6ca75f1f7e6d8fe7..fb1ae61ed84d515e68bc25a3171847073bb464e1 100644 (file)
@@ -175,7 +175,11 @@ public final class ConstPool {
      * at the given index.
      *
      * @return  a fully-qualified class or interface name specified
-     *          by <code>name_index</code>.
+     *          by <code>name_index</code>.  If the type is an array
+     *          type, this method returns an encoded name like
+     *          <code>[java.lang.Object;</code> (note that the separators
+     *          are not slashes but dots).
+     * @see javassist.ClassPool#getCtClass(String)
      */
     public String getClassInfo(int index) {
         ClassInfo c = (ClassInfo)getItem(index);
index e2163ad13d3b333564adf9c2a3acea7da4c8c9dd..5662222e2a9dabb6c29e860783673e25124d508a 100644 (file)
@@ -41,6 +41,11 @@ public class Descriptor {
     /**
      * Converts a class name from the internal representation used in
      * the JVM to the normal one used in Java.
+     * This method does not deal with an array type name such as
+     * "[Ljava/lang/Object;" and "[I;".  For such names, use
+     * <code>toClassName()</code>.
+     *
+     * @see #toClassName(String)
      */
     public static String toJavaName(String classname) {
         return classname.replace('/', '.');
@@ -525,7 +530,7 @@ public class Descriptor {
      * it accepts <code>Ljava.lang.Object;</code>
      * as well as <code>Ljava/lang/Object;</code>.
      *
-     * @param desc descriptor
+     * @param desc descriptor.
      * @param cp   the class pool used for obtaining
      *             a <code>CtClass</code> object.
      */
index effa801057888926bd037775e68abbd92aa3e19a..c70df21d54d7ab0c93ed850744cf77211e1fca6f 100644 (file)
@@ -65,7 +65,7 @@ public class Cast extends Expr {
         int pos = currentPos;
         int index = iterator.u16bitAt(pos + 1);
         String name = cp.getClassInfo(index);
-        return Descriptor.toCtClass(name, thisClass.getClassPool());
+        return thisClass.getClassPool().getCtClass(name);
     }
 
     /**
index fc0fb0adbc5ded0e0dd393d4c4341c01b6bc1374..6f8c44cff640fe89b8727b942e4b0731c96f55cb 100644 (file)
@@ -73,7 +73,7 @@ public class Handler extends Expr {
     public CtClass getType() throws NotFoundException {
         ConstPool cp = getConstPool();
         String name = cp.getClassInfo(etable.catchType(index));
-        return Descriptor.toCtClass(name, thisClass.getClassPool());
+        return thisClass.getClassPool().getCtClass(name);
     }
 
     /**
index b5de1b9713e08be616cbc64465da7c6026cd8752..f85357cf3f8c71b9c9e32d6e9faea7c4401c9a88 100644 (file)
@@ -68,7 +68,7 @@ public class Instanceof extends Expr {
         int pos = currentPos;
         int index = iterator.u16bitAt(pos + 1);
         String name = cp.getClassInfo(index);
-        return Descriptor.toCtClass(name, thisClass.getClassPool());
+        return thisClass.getClassPool().getCtClass(name);
     }
 
     /**