From 7a49552112a2e59dc9d5afc135dba918b8c36751 Mon Sep 17 00:00:00 2001 From: chiba Date: Wed, 17 Apr 2013 13:58:39 +0000 Subject: [PATCH] fixed JASSIST-181 git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@706 30ef5769-5b8d-40dd-aea6-55b5d6557bb3 --- Readme.html | 2 +- .../bytecode/SignatureAttribute.java | 17 +++++++++++ .../bytecode/annotation/ClassMemberValue.java | 11 +++++-- src/test/javassist/JvstTest4.java | 23 +++++++++++++++ src/test/test4/JIRA181.java | 29 +++++++++++++++++++ src/test/test4/JIRA181b.java | 12 ++++++++ 6 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/test/test4/JIRA181.java create mode 100644 src/test/test4/JIRA181b.java diff --git a/Readme.html b/Readme.html index 25d15562..f4c8b9a0 100644 --- a/Readme.html +++ b/Readme.html @@ -283,7 +283,7 @@ see javassist.Dump.

-version 3.18

-version 3.17.1 on December 3, 2012 diff --git a/src/main/javassist/bytecode/SignatureAttribute.java b/src/main/javassist/bytecode/SignatureAttribute.java index 1ab101e6..64b53952 100644 --- a/src/main/javassist/bytecode/SignatureAttribute.java +++ b/src/main/javassist/bytecode/SignatureAttribute.java @@ -942,6 +942,23 @@ public class SignatureAttribute extends AttributeInfo { } } + /** + * Parses the given signature string as a type signature. + * The type signature is either the field type signature or a base type + * descriptor including void type. + * + * @throws BadBytecode thrown when a syntactical error is found. + * @since 3.18 + */ + public static Type toTypeSignature(String sig) throws BadBytecode { + try { + return parseType(sig, new Cursor()); + } + catch (IndexOutOfBoundsException e) { + throw error(sig); + } + } + private static ClassSignature parseSig(String sig) throws BadBytecode, IndexOutOfBoundsException { diff --git a/src/main/javassist/bytecode/annotation/ClassMemberValue.java b/src/main/javassist/bytecode/annotation/ClassMemberValue.java index ad27e7b2..19f8560f 100644 --- a/src/main/javassist/bytecode/annotation/ClassMemberValue.java +++ b/src/main/javassist/bytecode/annotation/ClassMemberValue.java @@ -17,8 +17,11 @@ package javassist.bytecode.annotation; import javassist.ClassPool; +import javassist.bytecode.BadBytecode; import javassist.bytecode.ConstPool; import javassist.bytecode.Descriptor; +import javassist.bytecode.SignatureAttribute; + import java.io.IOException; import java.lang.reflect.Method; @@ -97,7 +100,11 @@ public class ClassMemberValue extends MemberValue { */ public String getValue() { String v = cp.getUtf8Info(valueIndex); - return Descriptor.toClassName(v); + try { + return SignatureAttribute.toTypeSignature(v).toString(); + } catch (BadBytecode e) { + throw new RuntimeException(e); + } } /** @@ -114,7 +121,7 @@ public class ClassMemberValue extends MemberValue { * Obtains the string representation of this object. */ public String toString() { - return "<" + getValue() + " class>"; + return getValue() + ".class"; } /** diff --git a/src/test/javassist/JvstTest4.java b/src/test/javassist/JvstTest4.java index 619b9e97..fe1ab7e8 100644 --- a/src/test/javassist/JvstTest4.java +++ b/src/test/javassist/JvstTest4.java @@ -839,6 +839,7 @@ public class JvstTest4 extends JvstTestRoot { assertEquals(12, invoke(obj, "test1")); } + // JASSIST-185 public void testLocalVariableTypeTable() throws Exception { CtClass cc = sloader.get("test4.Lvtt"); CtMethod m = cc.getDeclaredMethod("run"); @@ -846,4 +847,26 @@ public class JvstTest4 extends JvstTestRoot { cc.writeFile(); Object obj = make(cc.getName()); } + + // JASSISt-181 + public void testAnnotationWithGenerics() throws Exception { + CtClass cc0 = sloader.get("test4.JIRA181b"); + CtField field0 = cc0.getField("aField"); + String s0 = field0.getAnnotation(test4.JIRA181b.Condition.class).toString(); + assertEquals("@test4.JIRA181b$Condition(condition=java.lang.String.class)", s0); + CtField field01 = cc0.getField("aField2"); + String s01 = field01.getAnnotation(test4.JIRA181b.Condition.class).toString(); + assertEquals("@test4.JIRA181b$Condition(condition=void.class)", s01); + + CtClass cc = sloader.get("test4.JIRA181"); + CtField field = cc.getField("aField"); + String s = field.getAnnotation(test4.JIRA181.Condition.class).toString(); + assertEquals("@test4.JIRA181$Condition(condition=test4.JIRA181.B.class)", s); + CtField field2 = cc.getField("aField2"); + String s2 = field2.getAnnotation(test4.JIRA181.Condition2.class).toString(); + assertEquals("@test4.JIRA181$Condition2(condition=test4.JIRA181.B[].class)", s2); + } } + + + diff --git a/src/test/test4/JIRA181.java b/src/test/test4/JIRA181.java new file mode 100644 index 00000000..c3d2f45a --- /dev/null +++ b/src/test/test4/JIRA181.java @@ -0,0 +1,29 @@ +package test4; + +import java.util.ArrayList; + +public class JIRA181 extends ArrayList { + public @interface Condition { + Class condition(); + } + + public @interface Condition2 { + Class condition(); + } + + @Condition(condition = B.class) + public Object aField; + + @Condition2(condition = B[].class) + public Object aField2; + + public interface ICondition { + boolean match(Object src); + } + + private class B implements ICondition { + public boolean match(Object src) { + return JIRA181.this.size() > 0; + } + } +} diff --git a/src/test/test4/JIRA181b.java b/src/test/test4/JIRA181b.java new file mode 100644 index 00000000..133931ae --- /dev/null +++ b/src/test/test4/JIRA181b.java @@ -0,0 +1,12 @@ +package test4; + +public class JIRA181b { + public @interface Condition { + Class condition(); + } + + @Condition(condition = String.class) + public Object aField; + @Condition(condition = void.class) + public Object aField2; +} -- 2.39.5