]> source.dussan.org Git - javassist.git/commitdiff
added makeUniqueName() in CtClass.
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Mon, 31 Oct 2005 16:48:44 +0000 (16:48 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Mon, 31 Oct 2005 16:48:44 +0000 (16:48 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@215 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

Readme.html
src/main/javassist/CtClass.java
src/main/javassist/CtClassType.java
src/main/javassist/CtConstructor.java
src/main/javassist/Modifier.java
tutorial/tutorial.html
tutorial/tutorial2.html

index e5dec48f59e385cbf6dbaad44fe1da287c80009a..8cbfa2b961d6945dc932d411ae68476c9a1d027c 100644 (file)
@@ -287,6 +287,8 @@ see javassist.Dump.
   <li>getEnclosingClass() in javassist.CtClass was renamed
       to getEnclosingMethod().
   <li>toMethod() in javassist.CtConstructor has been implemented.
+  <li>javassist.preproc package was elminated and the source was
+      moved to the sample directory.
 </ul>
 
 <p>- version 3.1 RC2 in September 7, 2005
index 6e5196e580fb62d7e718f9087d39510936812376..c0962808729c0240d5ac22078b7bd816c10255ef 100644 (file)
@@ -1199,4 +1199,17 @@ public abstract class CtClass {
     {
         throw new CannotCompileException("not a class");
     }
+
+    /**
+     * Makes a unique member name.  This method guarantees that
+     * the returned name is not used as a prefix of any methods
+     * or fields visible in this class.
+     * If the returned name is XYZ, then any method or field names
+     * in this class do not start with XYZ.
+     *
+     * @param prefix        the prefix of the member name.
+     */
+    public String makeUniqueName(String prefix) {
+        throw new RuntimeException("not available in " + getName());
+    }
 }
index 0fb42def996b7e1752d3482c372da0c982cfc8cd..bdf389cdf269e23485946a2211bfe10578caf8b3 100644 (file)
@@ -26,6 +26,8 @@ import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Set;
+
 import javassist.bytecode.AccessFlag;
 import javassist.bytecode.AttributeInfo;
 import javassist.bytecode.AnnotationsAttribute;
@@ -1256,6 +1258,72 @@ class CtClassType extends CtClass {
     }
 
     int getUniqueNumber() { return uniqueNumberSeed++; }
+
+    public String makeUniqueName(String prefix) {
+        HashMap table = new HashMap();
+        makeMemberList(table);
+        Set keys = table.keySet();
+        String[] methods = new String[keys.size()];
+        keys.toArray(methods);
+
+        if (notFindInArray(prefix, methods))
+            return prefix;
+
+        int i = 100;
+        String name;
+        do {
+            if (i > 999)
+                throw new RuntimeException("too many unique name");
+
+            name = prefix + i++;
+        } while (!notFindInArray(name, methods));
+        return name;
+    }
+
+    private static boolean notFindInArray(String prefix, String[] values) {
+        int len = values.length;
+        for (int i = 0; i < len; i++)
+            if (values[i].startsWith(prefix))
+                return false;
+
+        return true;
+    }
+
+    private void makeMemberList(HashMap table) {
+        int mod = getModifiers();
+        if (Modifier.isAbstract(mod) || Modifier.isInterface(mod))
+            try {
+                CtClass[] ifs = getInterfaces();
+                int size = ifs.length;
+                for (int i = 0; i < size; i++) {
+                    CtClass ic =ifs[i];
+                    if (ic != null && ic instanceof CtClassType)
+                        ((CtClassType)ic).makeMemberList(table);
+                }
+            }
+            catch (NotFoundException e) {}
+
+        try {
+            CtClass s = getSuperclass();
+            if (s != null && s instanceof CtClassType)
+                ((CtClassType)s).makeMemberList(table);
+        }
+        catch (NotFoundException e) {}
+
+        List list = getClassFile2().getMethods();
+        int n = list.size();
+        for (int i = 0; i < n; i++) {
+            MethodInfo minfo = (MethodInfo)list.get(i);
+            table.put(minfo.getName(), this);
+        }
+
+        list = getClassFile2().getFields();
+        n = list.size();
+        for (int i = 0; i < n; i++) {
+            FieldInfo finfo = (FieldInfo)list.get(i);
+            table.put(finfo.getName(), this);
+        }
+    }
 }
 
 class FieldInitLink {
index 7bcf2622d3047447ce2d73c711e66452b1a4cb61..fa139c79d23e3ba42f114dde9d5d7529c31e0f3c 100644 (file)
@@ -153,6 +153,27 @@ public final class CtConstructor extends CtBehavior {
         return false;
     }
 
+    /**
+     * Returns true if this constructor calls a constructor
+     * of the super class.  This method returns false if it
+     * calls another constructor of this class by <code>this()</code>. 
+     */
+    public boolean callsSuper() throws CannotCompileException {
+        CodeAttribute codeAttr = methodInfo.getCodeAttribute();
+        if (codeAttr != null) {
+            CodeIterator it = codeAttr.iterator();
+            try {
+                int index = it.skipSuperConstructor();
+                return index >= 0;
+            }
+            catch (BadBytecode e) {
+                throw new CannotCompileException(e);
+            }
+        }
+
+        return false;
+    }
+
     /**
      * Sets a constructor body.
      *
index 01ac142512e5eb7704c74f13e9fc97390492426a..e41c725903aabe4a4fc65afd22846e49b19ad445 100644 (file)
@@ -175,6 +175,12 @@ public class Modifier {
         return mod & ~clearBit;
     }
 
+    /**
+     * Return a string describing the access modifier flags in
+     * the specified modifier.
+     *
+     * @param mod   modifier flags.
+     */
     public static String toString(int mod) {
         return java.lang.reflect.Modifier.toString(mod);
     }
index c2d54a8753cc7d9bcca5cc6156acb9a95ecc9a5f..f591abe74421ca4a824aea21c75091cb406444bf 100644 (file)
@@ -76,7 +76,9 @@ specified key.  If such a <code>CtClass</code> object is not found,
 then returned as the resulting value of <code>get()</code>.
 
 <p>The <code>CtClass</code> object obtained from a <code>ClassPool</code>
-object can be modified.
+object can be modified
+(<a href="tutorial2.html#intro">details of how to modify
+a <code>CtClass</code></a> will be presented later).
 In the example above, it is modified so that the superclass of
 <code>test.Rectangle</code> is changed into a class
 <code>test.Point</code>.  This change is reflected on the original
@@ -101,7 +103,7 @@ Class clazz = cc.toClass();
 <p><code>toClass()</code> requests the context class loader for the current
 thread to load the class file represented by the <code>CtClass</code>.  It
 returns a <code>java.lang.Class</code> object representing the loaded class.
-For more details, please see <a href="#toclass">the following section</a>.
+For more details, please see <a href="#toclass">this section below</a>.
 
 <a name="def">
 <h4>Defining a new class</h4>
index 50ee8ec030d31723e554e8c9a4e122ce3b8d0429..484e85ec8370cf19b138c9dcf908165a29c09a1f 100644 (file)
@@ -102,7 +102,7 @@ representing a <code>method_info</code> structure included in a class
 file.  The low-level API uses the vocabulary from the Java Virtual
 machine specification.  The users must have the knowledge about class
 files and bytecode.  For more details, the users should see the
-<code>javassist.bytecode</code> package.
+<a href="tutorial3.html#intro"><code>javassist.bytecode</code> package</a>.
 
 <p>The class files modified by Javassist requires the
 <code>javassist.runtime</code> package for runtime support