]> source.dussan.org Git - javassist.git/commitdiff
for fixing JASSIST-236, I've added getDeclaredMethods(String) to CtClass.
authorchibash <chiba@javassist.org>
Tue, 18 Nov 2014 20:49:27 +0000 (05:49 +0900)
committerchibash <chiba@javassist.org>
Tue, 18 Nov 2014 20:49:27 +0000 (05:49 +0900)
src/main/javassist/ClassPool.java
src/main/javassist/CtClass.java
src/main/javassist/CtClassType.java
src/test/javassist/JvstTest4.java
src/test/test4/AnnoLoad.java [new file with mode: 0644]
src/test/test4/DeclMethodsList.java [new file with mode: 0644]

index 4804b5932b898432e87c6e91040588e86c38999c..0493c6db96878338a95ae9ff05b3298549f3ba36 100644 (file)
@@ -815,7 +815,7 @@ public class ClassPool {
 
     /**
      * Creates a new public nested class.
-     * This method is called by CtClassType.makeNestedClass().
+     * This method is called by {@link CtClassType#makeNestedClass()}.
      *
      * @param classname     a fully-qualified class name.
      * @return      the nested class.
@@ -857,6 +857,23 @@ public class ClassPool {
         return clazz;
     }
 
+    /**
+     * Creates a new annotation.
+     * If there already exists a class/interface with the same name,
+     * the new interface overwrites that previous one.
+     *
+     * @param name      a fully-qualified interface name.
+     *                  Or null if the annotation has no super interface. 
+     * @param superclass the super interface.
+     * @throws RuntimeException if the existing interface is frozen.
+     * @since 3.19
+     */
+    public CtClass makeAnnotation(String name, CtClass superclass) throws RuntimeException {
+        CtClass cc = makeInterface(name, superclass);
+        cc.setModifiers(cc.getModifiers() | Modifier.ANNOTATION);
+        return cc;
+    }
+
     /**
      * Appends the system search path to the end of the
      * search path.  The system search path
index 9e4ca20c47b6c20a227701a9c4725cd20d6c1375..79d7efcb0e69776f1b93f746bf5aaa26832ab2d7 100644 (file)
@@ -26,10 +26,10 @@ import java.io.OutputStream;
 import java.net.URL;
 import java.security.ProtectionDomain;
 import java.util.Collection;
+
 import javassist.bytecode.ClassFile;
 import javassist.bytecode.Descriptor;
 import javassist.bytecode.Opcode;
-import javassist.bytecode.SignatureAttribute;
 import javassist.expr.ExprEditor;
 
 /* Note:
@@ -992,6 +992,20 @@ public abstract class CtClass {
         throw new NotFoundException(name);
     }
 
+    /**
+     * Retrieves methods with the specified name among the methods
+     * declared in the class.  Multiple methods with different parameters
+     * may be returned.
+     *
+     * <p>Note: this method does not search the superclasses.</p>
+     *
+     * @param name      method name.
+     * @since 3.19
+     */
+    public CtMethod[] getDeclaredMethods(String name) throws NotFoundException {
+        throw new NotFoundException(name);
+    }
+
     /**
      * Retrieves the method with the specified name among the methods
      * declared in the class.  If there are multiple methods with
index 4df382a9873db83b363083cf56d3a327c4bf959e..7ed43759a2234207e4fb73d855640c8b36d41e0d 100644 (file)
@@ -1205,6 +1205,20 @@ class CtClassType extends CtClass {
         return cms;
     }
 
+    public CtMethod[] getDeclaredMethods(String name) throws NotFoundException {
+        CtMember.Cache memCache = getMembers();
+        CtMember mth = memCache.methodHead();
+        CtMember mthTail = memCache.lastMethod();
+        ArrayList<CtMethod> methods = new ArrayList<CtMethod>();
+        while (mth != mthTail) {
+            mth = mth.next();
+            if (mth.getName().equals(name))
+                methods.add((CtMethod)mth);
+        }
+
+        return methods.toArray(new CtMethod[methods.size()]);
+    }
+
     public CtMethod getDeclaredMethod(String name) throws NotFoundException {
         CtMember.Cache memCache = getMembers();
         CtMember mth = memCache.methodHead();
index d92384b4f1def454df70389778a0758071f1de34..13784fd71cfdc039f7c910b6383d5a7139363413 100644 (file)
@@ -5,7 +5,10 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.util.HashSet;
+import java.util.List;
+
 import javassist.bytecode.*;
+import javassist.bytecode.annotation.Annotation;
 import javassist.expr.*;
 
 public class JvstTest4 extends JvstTestRoot {
@@ -1038,4 +1041,35 @@ public class JvstTest4 extends JvstTestRoot {
         assertEquals("test4.AnnoArg$B", a.value().getName());
         System.out.println(a.value().getName());
     }
+
+    public void testDeclaredMethods() throws Exception {
+        CtClass cc = sloader.get("test4.DeclMethodsList");
+        CtMethod[] meth = cc.getDeclaredMethods("foo");
+        assertEquals(2, meth.length);
+        assertEquals("()V", meth[0].getSignature());
+        assertEquals("(I)I", meth[1].getSignature());
+        meth = cc.getDeclaredMethods("bar");
+        assertEquals(1, meth.length);
+        assertEquals("()V", meth[0].getSignature());
+        meth = cc.getDeclaredMethods("baz");
+        assertEquals(0, meth.length);
+    }
+
+    public void testAnnotationLoader() throws Exception {
+        CtClass anno = sloader.makeAnnotation("test4.AnnoLoadAnno", null);
+        anno.debugWriteFile();
+        CtClass cc = sloader.get("test4.AnnoLoad");
+        CtMethod m = cc.getDeclaredMethod("foo");
+        ClassFile cf = cc.getClassFile();
+        ConstPool cp = cf.getConstPool();
+        AnnotationsAttribute attr
+            = new AnnotationsAttribute(cp, AnnotationsAttribute.visibleTag);
+        Annotation a = new Annotation(anno.getName(), cp);
+        attr.setAnnotation(a);
+        m.getMethodInfo().addAttribute(attr);
+        cc.writeFile();
+        Object obj = m.getAnnotations()[0];
+        String name = obj.getClass().getName();
+        assertEquals(anno.getName(), name);
+    }
 }
diff --git a/src/test/test4/AnnoLoad.java b/src/test/test4/AnnoLoad.java
new file mode 100644 (file)
index 0000000..fba397c
--- /dev/null
@@ -0,0 +1,5 @@
+package test4;
+
+public class AnnoLoad {
+    public int foo() { return 0; }
+}
diff --git a/src/test/test4/DeclMethodsList.java b/src/test/test4/DeclMethodsList.java
new file mode 100644 (file)
index 0000000..e762e4c
--- /dev/null
@@ -0,0 +1,7 @@
+package test4;
+
+public class DeclMethodsList {
+    public void foo() {}
+    int foo(int i) { return i; }
+    public void bar() {}
+}