<p>-version 3.18
<ul>
-JIRA JASSIST-183, 184, 189, 162, 185, 186, 190.
+JIRA JASSIST-181, 183, 184, 189, 162, 185, 186, 190.
</ul>
<p>-version 3.17.1 on December 3, 2012
}
}
+ /**
+ * Parses the given signature string as a type signature.
+ * The type signature is either the field type signature or a base type
+ * descriptor including <code>void</code> 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
{
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;
*/
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);
+ }
}
/**
* Obtains the string representation of this object.
*/
public String toString() {
- return "<" + getValue() + " class>";
+ return getValue() + ".class";
}
/**
assertEquals(12, invoke(obj, "test1"));
}
+ // JASSIST-185
public void testLocalVariableTypeTable() throws Exception {
CtClass cc = sloader.get("test4.Lvtt");
CtMethod m = cc.getDeclaredMethod("run");
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<T>.B.class)", s);
+ CtField field2 = cc.getField("aField2");
+ String s2 = field2.getAnnotation(test4.JIRA181.Condition2.class).toString();
+ assertEquals("@test4.JIRA181$Condition2(condition=test4.JIRA181<T>.B[].class)", s2);
+ }
}
+
+
+
--- /dev/null
+package test4;
+
+import java.util.ArrayList;
+
+public class JIRA181<T extends Number> extends ArrayList<T> {
+ public @interface Condition {
+ Class<? extends ICondition> 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;
+ }
+ }
+}
--- /dev/null
+package test4;
+
+public class JIRA181b {
+ public @interface Condition {
+ Class<?> condition();
+ }
+
+ @Condition(condition = String.class)
+ public Object aField;
+ @Condition(condition = void.class)
+ public Object aField2;
+}