|
|
@@ -11,11 +11,18 @@ |
|
|
|
* ******************************************************************/ |
|
|
|
package org.aspectj.weaver.reflect; |
|
|
|
|
|
|
|
import junit.framework.TestCase; |
|
|
|
import java.lang.reflect.Method; |
|
|
|
import java.lang.reflect.Type; |
|
|
|
|
|
|
|
import org.aspectj.bridge.IMessageHandler; |
|
|
|
import org.aspectj.weaver.ReferenceType; |
|
|
|
import org.aspectj.weaver.ResolvedMember; |
|
|
|
import org.aspectj.weaver.ResolvedType; |
|
|
|
import org.aspectj.weaver.UnresolvedType; |
|
|
|
import org.aspectj.weaver.World; |
|
|
|
import org.aspectj.weaver.bcel.BcelWorld; |
|
|
|
|
|
|
|
import junit.framework.TestCase; |
|
|
|
|
|
|
|
public class ReflectionWorldTest extends TestCase { |
|
|
|
|
|
|
@@ -38,5 +45,158 @@ public class ReflectionWorldTest extends TestCase { |
|
|
|
assertEquals("int", UnresolvedType.INT, world.resolve(int.class)); |
|
|
|
assertEquals("void", UnresolvedType.VOID, world.resolve(void.class)); |
|
|
|
} |
|
|
|
|
|
|
|
public void testTypeConversions_509327() throws Exception { |
|
|
|
ReflectionWorld rWorld = new ReflectionWorld(getClass().getClassLoader()); |
|
|
|
JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(rWorld); |
|
|
|
|
|
|
|
// Check basic conversion of String to String |
|
|
|
Method method = TestClass.class.getDeclaredMethod("m"); |
|
|
|
Type stringType = method.getGenericReturnType(); |
|
|
|
assertEquals("java.lang.String",stringType.getTypeName()); |
|
|
|
ResolvedType stringResolvedType = converter.fromType(stringType); |
|
|
|
assertEquals("java.lang.String",stringResolvedType.getName()); |
|
|
|
|
|
|
|
// public String m() { return ""; } |
|
|
|
method = TestClass2.class.getDeclaredMethod("m"); |
|
|
|
stringType = method.getGenericReturnType(); |
|
|
|
assertEquals("java.lang.String",stringType.getTypeName()); |
|
|
|
stringResolvedType = converter.fromType(stringType); |
|
|
|
assertEquals("java.lang.String",stringResolvedType.getName()); |
|
|
|
|
|
|
|
// Verify that the conversion process creates the same thing as the bcel unpacking |
|
|
|
|
|
|
|
// Here the return type is a non-static inner of a generic class |
|
|
|
// public Inner m2() { return null; } |
|
|
|
method = TestClass2.class.getDeclaredMethod("m2"); |
|
|
|
Type innerType = method.getGenericReturnType(); |
|
|
|
assertEquals("org.aspectj.weaver.reflect.ReflectionWorldTest.org.aspectj.weaver.reflect.ReflectionWorldTest$TestClass2<T>.Inner",innerType.getTypeName()); |
|
|
|
ResolvedType rType_Inner = converter.fromType(innerType); |
|
|
|
assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",rType_Inner.getSignature()); |
|
|
|
assertEquals(UnresolvedType.TypeKind.SIMPLE,rType_Inner.getTypekind()); |
|
|
|
ResolvedType rType_Outer = rType_Inner.getOuterClass(); |
|
|
|
assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2;",rType_Outer.getSignature()); |
|
|
|
|
|
|
|
BcelWorld bWorld = new BcelWorld(getClass().getClassLoader(), IMessageHandler.THROW, null); |
|
|
|
bWorld.setBehaveInJava5Way(true); |
|
|
|
UnresolvedType javaUtilHashMap = UnresolvedType.forName("java.util.HashMap"); |
|
|
|
ReferenceType rawType = (ReferenceType) bWorld.resolve(javaUtilHashMap); |
|
|
|
assertNotNull(rawType); |
|
|
|
|
|
|
|
// Now use bcel to resolve the same m2 method, and compare the signatures of the return types |
|
|
|
ResolvedType bResolved_TestClass2 = bWorld.resolve(UnresolvedType.forName(TestClass2.class.getName())); |
|
|
|
assertNotNull(bResolved_TestClass2); |
|
|
|
ResolvedMember bMethod_m2 = findMethod(bResolved_TestClass2,"m2"); |
|
|
|
ResolvedType bType_Inner = (ResolvedType) bMethod_m2.getReturnType(); |
|
|
|
assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",bType_Inner.getSignature()); |
|
|
|
assertEquals(UnresolvedType.TypeKind.SIMPLE,bType_Inner.getTypekind()); |
|
|
|
ResolvedType bType_Outer = bType_Inner.getOuterClass(); |
|
|
|
assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2;",bType_Outer.getSignature()); |
|
|
|
|
|
|
|
assertEquals(bType_Inner.getSignature(),rType_Inner.getSignature()); |
|
|
|
assertEquals(bType_Outer.getSignature(),rType_Outer.getSignature()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void testTypeConversions_509327_2() throws Exception { |
|
|
|
ReflectionWorld world = new ReflectionWorld(getClass().getClassLoader()); |
|
|
|
JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(world); |
|
|
|
BcelWorld bWorld = new BcelWorld(getClass().getClassLoader(), IMessageHandler.THROW, null); |
|
|
|
bWorld.setBehaveInJava5Way(true); |
|
|
|
|
|
|
|
// Slightly more advanced, now the method is returning a parameterized form of the outer |
|
|
|
// generic class |
|
|
|
|
|
|
|
// public TestClass2<String>.Inner m3() { return new TestClass2<String>.Inner("Foo"); } |
|
|
|
Method method = TestClass2.class.getDeclaredMethod("m3"); |
|
|
|
Type type_ParameterizedInner = method.getGenericReturnType(); |
|
|
|
assertEquals("org.aspectj.weaver.reflect.ReflectionWorldTest.org.aspectj.weaver.reflect.ReflectionWorldTest$TestClass2<java.lang.String>.Inner",type_ParameterizedInner.getTypeName()); |
|
|
|
ResolvedType rType_ParameterizedInner = converter.fromType(type_ParameterizedInner); |
|
|
|
// NOTE: DECLARED PARAMETERIZATION OF OUTER IS LOST |
|
|
|
assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",rType_ParameterizedInner.getSignature()); |
|
|
|
|
|
|
|
ResolvedType bResolved_TestClass2 = bWorld.resolve(UnresolvedType.forName(TestClass2.class.getName())); |
|
|
|
assertNotNull(bResolved_TestClass2); |
|
|
|
ResolvedMember bMethod_m3 = findMethod(bResolved_TestClass2,"m3"); |
|
|
|
ResolvedType bType_Inner = (ResolvedType) bMethod_m3.getReturnType(); |
|
|
|
// NOTE: DECLARED PARAMETERIZATION OF OUTER IS LOST |
|
|
|
assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",bType_Inner.getSignature()); |
|
|
|
|
|
|
|
assertEquals(UnresolvedType.TypeKind.SIMPLE,bType_Inner.getTypekind()); |
|
|
|
ResolvedType bType_Outer = bType_Inner.getOuterClass(); |
|
|
|
|
|
|
|
// Fields seem to lose it too, although the backinggenericmember has the info |
|
|
|
// ResolvedMember bField_f = findField(bResolved_TestClass2,"f"); |
|
|
|
// ResolvedMember backingGenericMember = bField_f.getBackingGenericMember(); |
|
|
|
// System.out.println(backingGenericMember); |
|
|
|
// System.out.println(backingGenericMember.getGenericReturnType()); |
|
|
|
// System.out.println(bField_f); |
|
|
|
// System.out.println(bField_f.getSignature()); |
|
|
|
// System.out.println(bField_f.getGenericReturnType()); |
|
|
|
} |
|
|
|
|
|
|
|
// public void testbar() throws Exception { |
|
|
|
// ReflectionWorld world = new ReflectionWorld(getClass().getClassLoader()); |
|
|
|
// JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(world); |
|
|
|
// |
|
|
|
// // public TestClass2<String>.Inner m3() { return new TestClass2<String>.Inner("Foo"); } |
|
|
|
// Method method = TestClass2.class.getDeclaredMethod("m3"); |
|
|
|
// Type type_ParameterizedInner = method.getGenericReturnType(); |
|
|
|
// assertEquals("org.aspectj.weaver.reflect.ReflectionWorldTest.org.aspectj.weaver.reflect.ReflectionWorldTest$TestClass2<java.lang.String>.Inner",type_ParameterizedInner.getTypeName()); |
|
|
|
// ResolvedType rType_ParameterizedInner = converter.fromType(type_ParameterizedInner); |
|
|
|
// System.out.println(rType_ParameterizedInner); |
|
|
|
// System.out.println(type_ParameterizedInner.getTypeName()); |
|
|
|
// } |
|
|
|
// |
|
|
|
// public void testfoo() { |
|
|
|
// ReflectionWorld world = new ReflectionWorld(getClass().getClassLoader()); |
|
|
|
// JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(world); |
|
|
|
// BcelWorld bWorld = new BcelWorld(getClass().getClassLoader(), IMessageHandler.THROW, null); |
|
|
|
// bWorld.setBehaveInJava5Way(true); |
|
|
|
// |
|
|
|
// |
|
|
|
// ResolvedType bResolved_TestClass2 = bWorld.resolve(UnresolvedType.forName(TestClass2.class.getName())); |
|
|
|
// ResolvedMember bField_f = findField(bResolved_TestClass2,"f"); |
|
|
|
// System.out.println(bField_f); |
|
|
|
// System.out.println(bField_f.getGenericReturnType()); |
|
|
|
// System.out.println(bField_f.getReturnType()); |
|
|
|
// System.out.println(bField_f.getBackingGenericMember().getGenericReturnType()); |
|
|
|
// } |
|
|
|
|
|
|
|
static class TestClass { |
|
|
|
public String m() { return ""; } |
|
|
|
} |
|
|
|
|
|
|
|
static class TestClass2<T> { |
|
|
|
class Inner { |
|
|
|
T t; |
|
|
|
Inner(T t) { |
|
|
|
this.t = t; |
|
|
|
} |
|
|
|
} |
|
|
|
public String m() { return ""; } |
|
|
|
public Inner m2() { return null; } |
|
|
|
public TestClass2<String> f; |
|
|
|
public TestClass2<String>.Inner m3() { return new TestClass2<String>.Inner("Foo"); } |
|
|
|
} |
|
|
|
|
|
|
|
private ResolvedMember findMethod(ResolvedType resolvedType, String methodName) { |
|
|
|
for (ResolvedMember method: resolvedType.getDeclaredMethods()) { |
|
|
|
if (method.getName().equals(methodName)) { |
|
|
|
return method; |
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
private ResolvedMember findField(ResolvedType resolvedType, String fieldName) { |
|
|
|
for (ResolvedMember field: resolvedType.getDeclaredFields()) { |
|
|
|
if (field.getName().equals(fieldName)) { |
|
|
|
return field; |
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |