]> source.dussan.org Git - javassist.git/commitdiff
updated CtMember.append() for better performance.
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 4 Nov 2005 06:00:46 +0000 (06:00 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 4 Nov 2005 06:00:46 +0000 (06:00 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@216 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/CtClassType.java
src/main/javassist/CtMember.java
tutorial/tutorial.html

index bdf389cdf269e23485946a2211bfe10578caf8b3..8d8e67d1abfc9dd6b5388a3bbc2bcfe38e1d10e0 100644 (file)
@@ -618,11 +618,16 @@ class CtClassType extends CtClass {
         if (fieldsCache == null) {
             List list = getClassFile2().getFields();
             int n = list.size();
+            CtMember allFields = null;
+            CtField tail = null;
             for (int i = 0; i < n; ++i) {
                 FieldInfo finfo = (FieldInfo)list.get(i);
-                fieldsCache = CtMember.append(fieldsCache,
-                                             new CtField(finfo, this));
+                CtField newTail = new CtField(finfo, this);
+                allFields = CtMember.append(allFields, tail, newTail);
+                tail = newTail;
             }
+
+            fieldsCache = allFields;
         }
 
         return fieldsCache;
@@ -721,13 +726,18 @@ class CtClassType extends CtClass {
         if (constructorsCache == null) {
             List list = getClassFile2().getMethods();
             int n = list.size();
+            CtMember allConstructors = null;
+            CtConstructor tail = null;
             for (int i = 0; i < n; ++i) {
                 MethodInfo minfo = (MethodInfo)list.get(i);
-                if (minfo.isConstructor())
-                    constructorsCache
-                        = CtMember.append(constructorsCache,
-                                          new CtConstructor(minfo, this));
+                if (minfo.isConstructor()) {
+                    CtConstructor newTail = new CtConstructor(minfo, this);
+                    allConstructors = CtMember.append(allConstructors, tail, newTail);
+                    tail = newTail;
+                }
             }
+
+            constructorsCache = allConstructors;
         }
 
         return constructorsCache;
@@ -870,12 +880,18 @@ class CtClassType extends CtClass {
         if (methodsCache == null) {
             List list = getClassFile2().getMethods();
             int n = list.size();
+            CtMember allMethods = null;
+            CtMethod tail = null;
             for (int i = 0; i < n; ++i) {
                 MethodInfo minfo = (MethodInfo)list.get(i);
-                if (minfo.isMethod())
-                    methodsCache = CtMember.append(methodsCache,
-                                                   new CtMethod(minfo, this));
+                if (minfo.isMethod()) {
+                    CtMethod newTail = new CtMethod(minfo, this);
+                    allMethods = CtMember.append(allMethods, tail, newTail);
+                    tail = newTail;
+                }
             }
+
+            methodsCache = allMethods;
         }
 
         return methodsCache;
index d6bd14f1e8b47a7446be33d11861812061be5f86..b04e107a2d65d5d298e0a9e6d7869f8d911e3368 100644 (file)
@@ -25,6 +25,16 @@ public abstract class CtMember {
 
     protected CtMember(CtClass clazz) { declaringClass = clazz; }
 
+    static CtMember append(CtMember list, CtMember previousTail, CtMember tail) {
+        tail.next = null;
+        if (list == null)
+            return tail;
+        else {
+            previousTail.next = tail;
+            return list;
+        }
+    }
+
     static CtMember append(CtMember list, CtMember tail) {
         tail.next = null;
         if (list == null)
index f591abe74421ca4a824aea21c75091cb406444bf..271e88de5260d82107bb120a66e33b8fbba3bf0f 100644 (file)
@@ -298,7 +298,9 @@ such a method call, the <code>ClassPool</code>
 must contain all the instances of <code>CtClass</code> all the time of
 program execution.
 
+<a name="avoidmemory">
 <h4>Avoid out of memory</h4>
+</a>
 
 <p>
 This specification of <code>ClassPool</code> may cause huge memory
@@ -337,13 +339,26 @@ cp.appendSystemPath();    // or append another path by appendClassPath()
 default <code>ClassPool</code> returned by
 <code>ClassPool.getDefault()</code> does.
 Note that <code>ClassPool.getDefault()</code> is a singleton factory method
-provided for convenience.  Therefore, the default <code>ClassPool</code>
-is never garbage-collected.
+provided for convenience.  It creates a <code>ClassPool</code> object in
+the same way shown above although it keeps a single instance of
+<code>ClassPool</code> and reuses it.
+A <code>ClassPool</code> object returned by <code>getDefault()</code>
+does not have a special role.  <code>getDefault()</code> is a convenience
+method.
+
 
 <h4>Cascaded ClassPools.</h4>
 
 <p>
-<code>ClassPool</code> objects can be cascaded like
+<em>If a program is running on a web application server,</em>
+creating multiple instances of <code>ClassPool</code> might be necessary;
+an instance of <code>ClassPool</code> should be created
+for each class loader (i.e. container).
+The program should create a <code>ClassPool</code> object by not calling
+<code>getDefault()</code> but a constructor of <code>ClassPool</code>.
+
+<p>
+Multiple <code>ClassPool</code> objects can be cascaded like
 <code>java.lang.ClassLoader</code>.  For example,
 
 <ul><pre>
@@ -435,7 +450,7 @@ transformation.
 <p>To create another copy of the default instance of
 <code>ClassPool</code>, which is returned by
 <code>ClassPool.getDefault()</code>, execute the following code
-snippet (this code was already shown above):
+snippet (this code was already <a href="#avoidmemory">shown above</a>):
 
 <ul><pre>
 ClassPool cp = new ClassPool();