git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@706 30ef5769-5b8d-40dd-aea6-55b5d6557bb3tags/log
<p>-version 3.18 | <p>-version 3.18 | ||||
<ul> | <ul> | ||||
JIRA JASSIST-183, 184, 189, 162, 185, 186, 190. | |||||
JIRA JASSIST-181, 183, 184, 189, 162, 185, 186, 190. | |||||
</ul> | </ul> | ||||
<p>-version 3.17.1 on December 3, 2012 | <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) | private static ClassSignature parseSig(String sig) | ||||
throws BadBytecode, IndexOutOfBoundsException | throws BadBytecode, IndexOutOfBoundsException | ||||
{ | { |
package javassist.bytecode.annotation; | package javassist.bytecode.annotation; | ||||
import javassist.ClassPool; | import javassist.ClassPool; | ||||
import javassist.bytecode.BadBytecode; | |||||
import javassist.bytecode.ConstPool; | import javassist.bytecode.ConstPool; | ||||
import javassist.bytecode.Descriptor; | import javassist.bytecode.Descriptor; | ||||
import javassist.bytecode.SignatureAttribute; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
*/ | */ | ||||
public String getValue() { | public String getValue() { | ||||
String v = cp.getUtf8Info(valueIndex); | 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. | * Obtains the string representation of this object. | ||||
*/ | */ | ||||
public String toString() { | public String toString() { | ||||
return "<" + getValue() + " class>"; | |||||
return getValue() + ".class"; | |||||
} | } | ||||
/** | /** |
assertEquals(12, invoke(obj, "test1")); | assertEquals(12, invoke(obj, "test1")); | ||||
} | } | ||||
// JASSIST-185 | |||||
public void testLocalVariableTypeTable() throws Exception { | public void testLocalVariableTypeTable() throws Exception { | ||||
CtClass cc = sloader.get("test4.Lvtt"); | CtClass cc = sloader.get("test4.Lvtt"); | ||||
CtMethod m = cc.getDeclaredMethod("run"); | CtMethod m = cc.getDeclaredMethod("run"); | ||||
cc.writeFile(); | cc.writeFile(); | ||||
Object obj = make(cc.getName()); | 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); | |||||
} | |||||
} | } | ||||
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; | |||||
} | |||||
} | |||||
} |
package test4; | |||||
public class JIRA181b { | |||||
public @interface Condition { | |||||
Class<?> condition(); | |||||
} | |||||
@Condition(condition = String.class) | |||||
public Object aField; | |||||
@Condition(condition = void.class) | |||||
public Object aField2; | |||||
} |