您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

ReflectionWorldTest.java 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /* *******************************************************************
  2. * Copyright (c) 2005 Contributors.
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * Adrian Colyer Initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.reflect;
  13. import java.lang.reflect.Method;
  14. import java.lang.reflect.Type;
  15. import org.aspectj.bridge.IMessageHandler;
  16. import org.aspectj.weaver.ReferenceType;
  17. import org.aspectj.weaver.ResolvedMember;
  18. import org.aspectj.weaver.ResolvedType;
  19. import org.aspectj.weaver.UnresolvedType;
  20. import org.aspectj.weaver.World;
  21. import org.aspectj.weaver.bcel.BcelWorld;
  22. import junit.framework.TestCase;
  23. public class ReflectionWorldTest extends TestCase {
  24. public void testDelegateCreation() {
  25. World world = new ReflectionWorld(getClass().getClassLoader());
  26. ResolvedType rt = world.resolve("java.lang.Object");
  27. assertNotNull(rt);
  28. assertEquals("Ljava/lang/Object;", rt.getSignature());
  29. }
  30. public void testArrayTypes() {
  31. IReflectionWorld world = new ReflectionWorld(getClass().getClassLoader());
  32. String[] strArray = new String[1];
  33. ResolvedType rt = world.resolve(strArray.getClass());
  34. assertTrue(rt.isArray());
  35. }
  36. public void testPrimitiveTypes() {
  37. IReflectionWorld world = new ReflectionWorld(getClass().getClassLoader());
  38. assertEquals("int", UnresolvedType.INT, world.resolve(int.class));
  39. assertEquals("void", UnresolvedType.VOID, world.resolve(void.class));
  40. }
  41. public void testTypeConversions_509327() throws Exception {
  42. ReflectionWorld rWorld = new ReflectionWorld(getClass().getClassLoader());
  43. JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(rWorld);
  44. // Check basic conversion of String to String
  45. Method method = TestClass.class.getDeclaredMethod("m");
  46. Type stringType = method.getGenericReturnType();
  47. assertEquals("java.lang.String",stringType.getTypeName());
  48. ResolvedType stringResolvedType = converter.fromType(stringType);
  49. assertEquals("java.lang.String",stringResolvedType.getName());
  50. // public String m() { return ""; }
  51. method = TestClass2.class.getDeclaredMethod("m");
  52. stringType = method.getGenericReturnType();
  53. assertEquals("java.lang.String",stringType.getTypeName());
  54. stringResolvedType = converter.fromType(stringType);
  55. assertEquals("java.lang.String",stringResolvedType.getName());
  56. // Verify that the conversion process creates the same thing as the bcel unpacking
  57. // Here the return type is a non-static inner of a generic class
  58. // public Inner m2() { return null; }
  59. method = TestClass2.class.getDeclaredMethod("m2");
  60. Type innerType = method.getGenericReturnType();
  61. assertEquals("org.aspectj.weaver.reflect.ReflectionWorldTest.org.aspectj.weaver.reflect.ReflectionWorldTest$TestClass2<T>.Inner",innerType.getTypeName());
  62. ResolvedType rType_Inner = converter.fromType(innerType);
  63. assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",rType_Inner.getSignature());
  64. assertEquals(UnresolvedType.TypeKind.SIMPLE,rType_Inner.getTypekind());
  65. ResolvedType rType_Outer = rType_Inner.getOuterClass();
  66. assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2;",rType_Outer.getSignature());
  67. BcelWorld bWorld = new BcelWorld(getClass().getClassLoader(), IMessageHandler.THROW, null);
  68. bWorld.setBehaveInJava5Way(true);
  69. UnresolvedType javaUtilHashMap = UnresolvedType.forName("java.util.HashMap");
  70. ReferenceType rawType = (ReferenceType) bWorld.resolve(javaUtilHashMap);
  71. assertNotNull(rawType);
  72. // Now use bcel to resolve the same m2 method, and compare the signatures of the return types
  73. ResolvedType bResolved_TestClass2 = bWorld.resolve(UnresolvedType.forName(TestClass2.class.getName()));
  74. assertNotNull(bResolved_TestClass2);
  75. ResolvedMember bMethod_m2 = findMethod(bResolved_TestClass2,"m2");
  76. ResolvedType bType_Inner = (ResolvedType) bMethod_m2.getReturnType();
  77. assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",bType_Inner.getSignature());
  78. assertEquals(UnresolvedType.TypeKind.SIMPLE,bType_Inner.getTypekind());
  79. ResolvedType bType_Outer = bType_Inner.getOuterClass();
  80. assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2;",bType_Outer.getSignature());
  81. assertEquals(bType_Inner.getSignature(),rType_Inner.getSignature());
  82. assertEquals(bType_Outer.getSignature(),rType_Outer.getSignature());
  83. }
  84. public void testTypeConversions_509327_2() throws Exception {
  85. ReflectionWorld world = new ReflectionWorld(getClass().getClassLoader());
  86. JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(world);
  87. BcelWorld bWorld = new BcelWorld(getClass().getClassLoader(), IMessageHandler.THROW, null);
  88. bWorld.setBehaveInJava5Way(true);
  89. // Slightly more advanced, now the method is returning a parameterized form of the outer
  90. // generic class
  91. // public TestClass2<String>.Inner m3() { return new TestClass2<String>.Inner("Foo"); }
  92. Method method = TestClass2.class.getDeclaredMethod("m3");
  93. Type type_ParameterizedInner = method.getGenericReturnType();
  94. assertEquals("org.aspectj.weaver.reflect.ReflectionWorldTest.org.aspectj.weaver.reflect.ReflectionWorldTest$TestClass2<java.lang.String>.Inner",type_ParameterizedInner.getTypeName());
  95. ResolvedType rType_ParameterizedInner = converter.fromType(type_ParameterizedInner);
  96. // NOTE: DECLARED PARAMETERIZATION OF OUTER IS LOST
  97. assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",rType_ParameterizedInner.getSignature());
  98. ResolvedType bResolved_TestClass2 = bWorld.resolve(UnresolvedType.forName(TestClass2.class.getName()));
  99. assertNotNull(bResolved_TestClass2);
  100. ResolvedMember bMethod_m3 = findMethod(bResolved_TestClass2,"m3");
  101. ResolvedType bType_Inner = (ResolvedType) bMethod_m3.getReturnType();
  102. // NOTE: DECLARED PARAMETERIZATION OF OUTER IS LOST
  103. assertEquals("Lorg/aspectj/weaver/reflect/ReflectionWorldTest$TestClass2$Inner;",bType_Inner.getSignature());
  104. assertEquals(UnresolvedType.TypeKind.SIMPLE,bType_Inner.getTypekind());
  105. ResolvedType bType_Outer = bType_Inner.getOuterClass();
  106. // Fields seem to lose it too, although the backinggenericmember has the info
  107. // ResolvedMember bField_f = findField(bResolved_TestClass2,"f");
  108. // ResolvedMember backingGenericMember = bField_f.getBackingGenericMember();
  109. // System.out.println(backingGenericMember);
  110. // System.out.println(backingGenericMember.getGenericReturnType());
  111. // System.out.println(bField_f);
  112. // System.out.println(bField_f.getSignature());
  113. // System.out.println(bField_f.getGenericReturnType());
  114. }
  115. // public void testbar() throws Exception {
  116. // ReflectionWorld world = new ReflectionWorld(getClass().getClassLoader());
  117. // JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(world);
  118. //
  119. // // public TestClass2<String>.Inner m3() { return new TestClass2<String>.Inner("Foo"); }
  120. // Method method = TestClass2.class.getDeclaredMethod("m3");
  121. // Type type_ParameterizedInner = method.getGenericReturnType();
  122. // assertEquals("org.aspectj.weaver.reflect.ReflectionWorldTest.org.aspectj.weaver.reflect.ReflectionWorldTest$TestClass2<java.lang.String>.Inner",type_ParameterizedInner.getTypeName());
  123. // ResolvedType rType_ParameterizedInner = converter.fromType(type_ParameterizedInner);
  124. // System.out.println(rType_ParameterizedInner);
  125. // System.out.println(type_ParameterizedInner.getTypeName());
  126. // }
  127. //
  128. // public void testfoo() {
  129. // ReflectionWorld world = new ReflectionWorld(getClass().getClassLoader());
  130. // JavaLangTypeToResolvedTypeConverter converter = new JavaLangTypeToResolvedTypeConverter(world);
  131. // BcelWorld bWorld = new BcelWorld(getClass().getClassLoader(), IMessageHandler.THROW, null);
  132. // bWorld.setBehaveInJava5Way(true);
  133. //
  134. //
  135. // ResolvedType bResolved_TestClass2 = bWorld.resolve(UnresolvedType.forName(TestClass2.class.getName()));
  136. // ResolvedMember bField_f = findField(bResolved_TestClass2,"f");
  137. // System.out.println(bField_f);
  138. // System.out.println(bField_f.getGenericReturnType());
  139. // System.out.println(bField_f.getReturnType());
  140. // System.out.println(bField_f.getBackingGenericMember().getGenericReturnType());
  141. // }
  142. static class TestClass {
  143. public String m() { return ""; }
  144. }
  145. static class TestClass2<T> {
  146. class Inner {
  147. T t;
  148. Inner(T t) {
  149. this.t = t;
  150. }
  151. }
  152. public String m() { return ""; }
  153. public Inner m2() { return null; }
  154. public TestClass2<String> f;
  155. public TestClass2<String>.Inner m3() { return new TestClass2<String>.Inner("Foo"); }
  156. }
  157. private ResolvedMember findMethod(ResolvedType resolvedType, String methodName) {
  158. for (ResolvedMember method: resolvedType.getDeclaredMethods()) {
  159. if (method.getName().equals(methodName)) {
  160. return method;
  161. }
  162. }
  163. return null;
  164. }
  165. private ResolvedMember findField(ResolvedType resolvedType, String fieldName) {
  166. for (ResolvedMember field: resolvedType.getDeclaredFields()) {
  167. if (field.getName().equals(fieldName)) {
  168. return field;
  169. }
  170. }
  171. return null;
  172. }
  173. }