Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

ReflectionBasedReferenceTypeDelegateFactory.java 11KB

15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
15 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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 v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. *
  9. * Contributors:
  10. * Adrian Colyer Initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.reflect;
  13. import java.lang.reflect.Constructor;
  14. import java.lang.reflect.Field;
  15. import java.lang.reflect.InvocationTargetException;
  16. import java.lang.reflect.Member;
  17. import java.lang.reflect.Method;
  18. import java.lang.reflect.Modifier;
  19. import org.aspectj.weaver.ReferenceType;
  20. import org.aspectj.weaver.ResolvedMember;
  21. import org.aspectj.weaver.ResolvedMemberImpl;
  22. import org.aspectj.weaver.ResolvedType;
  23. import org.aspectj.weaver.UnresolvedType;
  24. import org.aspectj.weaver.World;
  25. /**
  26. * @author colyer Creates the appropriate ReflectionBasedReferenceTypeDelegate according to the VM level we are running at. Uses
  27. * reflection to avoid 1.5 dependencies in 1.4 and 1.3 code base.
  28. */
  29. public class ReflectionBasedReferenceTypeDelegateFactory {
  30. public static ReflectionBasedReferenceTypeDelegate createDelegate(ReferenceType forReferenceType, World inWorld,
  31. ClassLoader usingClassLoader) {
  32. try {
  33. Class c = Class.forName(forReferenceType.getName(), false, usingClassLoader);
  34. ReflectionBasedReferenceTypeDelegate rbrtd = create15Delegate(forReferenceType, c, usingClassLoader, inWorld);
  35. if (rbrtd != null) {
  36. return rbrtd; // can be null if we didn't find the class the delegate logic loads
  37. }
  38. return new ReflectionBasedReferenceTypeDelegate(c, usingClassLoader, inWorld, forReferenceType);
  39. } catch (ClassNotFoundException cnfEx) {
  40. return null;
  41. }
  42. }
  43. public static ReflectionBasedReferenceTypeDelegate createDelegate(ReferenceType forReferenceType, World inWorld,
  44. Class<?> clazz) {
  45. ReflectionBasedReferenceTypeDelegate rbrtd = create15Delegate(forReferenceType, clazz, clazz.getClassLoader(), inWorld);
  46. if (rbrtd != null) {
  47. return rbrtd; // can be null if we didn't find the class the delegate logic loads
  48. }
  49. return new ReflectionBasedReferenceTypeDelegate(clazz, clazz.getClassLoader(), inWorld, forReferenceType);
  50. }
  51. public static ReflectionBasedReferenceTypeDelegate create14Delegate(ReferenceType forReferenceType, World inWorld,
  52. ClassLoader usingClassLoader) {
  53. try {
  54. Class c = Class.forName(forReferenceType.getName(), false, usingClassLoader);
  55. return new ReflectionBasedReferenceTypeDelegate(c, usingClassLoader, inWorld, forReferenceType);
  56. } catch (ClassNotFoundException cnfEx) {
  57. return null;
  58. }
  59. }
  60. // can return 'null' if we can't find the class
  61. private static ReflectionBasedReferenceTypeDelegate create15Delegate(ReferenceType forReferenceType, Class forClass,
  62. ClassLoader usingClassLoader, World inWorld) {
  63. try {
  64. Class delegateClass = Class.forName("org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate");
  65. ReflectionBasedReferenceTypeDelegate ret = (ReflectionBasedReferenceTypeDelegate) delegateClass.getDeclaredConstructor().newInstance();
  66. ret.initialize(forReferenceType, forClass, usingClassLoader, inWorld);
  67. return ret;
  68. } catch (ClassNotFoundException cnfEx) {
  69. throw new IllegalStateException(
  70. "Attempted to create Java 1.5 reflection based delegate but org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate was not found on classpath");
  71. } catch (InstantiationException insEx) {
  72. throw new IllegalStateException("Attempted to create Java 1.5 reflection based delegate but InstantiationException: "
  73. + insEx + " occured");
  74. } catch (IllegalAccessException illAccEx) {
  75. throw new IllegalStateException("Attempted to create Java 1.5 reflection based delegate but IllegalAccessException: "
  76. + illAccEx + " occured");
  77. } catch (NoSuchMethodException nsMethEx) {
  78. throw new IllegalStateException("Attempted to create Java 1.5 reflection based delegate but NoSuchMethodException: "
  79. + nsMethEx + " occured");
  80. } catch (InvocationTargetException invTargEx) {
  81. throw new IllegalStateException("Attempted to create Java 1.5 reflection based delegate but InvocationTargetException: "
  82. + invTargEx + " occured");
  83. }
  84. }
  85. private static GenericSignatureInformationProvider createGenericSignatureProvider(World inWorld) {
  86. try {
  87. Class providerClass = Class.forName("org.aspectj.weaver.reflect.Java15GenericSignatureInformationProvider");
  88. Constructor cons = providerClass.getConstructor(new Class[] { World.class });
  89. GenericSignatureInformationProvider ret = (GenericSignatureInformationProvider) cons
  90. .newInstance(new Object[] { inWorld });
  91. return ret;
  92. } catch (ClassNotFoundException cnfEx) {
  93. // drop through and create a 14 provider...
  94. // throw new
  95. // IllegalStateException("Attempted to create Java 1.5 generic signature provider but org.aspectj.weaver.reflect.Java15GenericSignatureInformationProvider was not found on classpath");
  96. } catch (NoSuchMethodException nsmEx) {
  97. throw new IllegalStateException("Attempted to create Java 1.5 generic signature provider but: " + nsmEx
  98. + " occured");
  99. } catch (InstantiationException insEx) {
  100. throw new IllegalStateException("Attempted to create Java 1.5 generic signature provider but: " + insEx
  101. + " occured");
  102. } catch (InvocationTargetException invEx) {
  103. throw new IllegalStateException("Attempted to create Java 1.5 generic signature provider but: " + invEx
  104. + " occured");
  105. } catch (IllegalAccessException illAcc) {
  106. throw new IllegalStateException("Attempted to create Java 1.5 generic signature provider but: " + illAcc
  107. + " occured");
  108. }
  109. return new Java14GenericSignatureInformationProvider();
  110. }
  111. /**
  112. * convert a java.lang.reflect.Member into a resolved member in the world
  113. *
  114. * @param reflectMember
  115. * @param inWorld
  116. * @return
  117. */
  118. public static ResolvedMember createResolvedMember(Member reflectMember, World inWorld) {
  119. if (reflectMember instanceof Method) {
  120. return createResolvedMethod((Method) reflectMember, inWorld);
  121. } else if (reflectMember instanceof Constructor) {
  122. return createResolvedConstructor((Constructor) reflectMember, inWorld);
  123. } else {
  124. return createResolvedField((Field) reflectMember, inWorld);
  125. }
  126. }
  127. public static ResolvedMember createResolvedMethod(Method aMethod, World inWorld) {
  128. ReflectionBasedResolvedMemberImpl ret = new ReflectionBasedResolvedMemberImpl(org.aspectj.weaver.Member.METHOD,
  129. toResolvedType(aMethod.getDeclaringClass(), (IReflectionWorld) inWorld), aMethod.getModifiers(), toResolvedType(
  130. aMethod.getReturnType(), (IReflectionWorld) inWorld), aMethod.getName(), toResolvedTypeArray(
  131. aMethod.getParameterTypes(), inWorld), toResolvedTypeArray(aMethod.getExceptionTypes(), inWorld), aMethod);
  132. if (inWorld instanceof IReflectionWorld) {
  133. ret.setAnnotationFinder(((IReflectionWorld) inWorld).getAnnotationFinder());
  134. }
  135. ret.setGenericSignatureInformationProvider(createGenericSignatureProvider(inWorld));
  136. return ret;
  137. }
  138. public static ResolvedMember createResolvedAdviceMember(Method aMethod, World inWorld) {
  139. ReflectionBasedResolvedMemberImpl ret = new ReflectionBasedResolvedMemberImpl(org.aspectj.weaver.Member.ADVICE,
  140. toResolvedType(aMethod.getDeclaringClass(), (IReflectionWorld) inWorld), aMethod.getModifiers(), toResolvedType(
  141. aMethod.getReturnType(), (IReflectionWorld) inWorld), aMethod.getName(), toResolvedTypeArray(
  142. aMethod.getParameterTypes(), inWorld), toResolvedTypeArray(aMethod.getExceptionTypes(), inWorld), aMethod);
  143. if (inWorld instanceof IReflectionWorld) {
  144. ret.setAnnotationFinder(((IReflectionWorld) inWorld).getAnnotationFinder());
  145. }
  146. ret.setGenericSignatureInformationProvider(createGenericSignatureProvider(inWorld));
  147. return ret;
  148. }
  149. public static ResolvedMember createStaticInitMember(Class forType, World inWorld) {
  150. return new ResolvedMemberImpl(org.aspectj.weaver.Member.STATIC_INITIALIZATION, toResolvedType(forType,
  151. (IReflectionWorld) inWorld), Modifier.STATIC, UnresolvedType.VOID, "<clinit>", UnresolvedType.NONE,
  152. UnresolvedType.NONE);
  153. }
  154. public static ResolvedMember createResolvedConstructor(Constructor aConstructor, World inWorld) {
  155. ReflectionBasedResolvedMemberImpl ret = new ReflectionBasedResolvedMemberImpl(org.aspectj.weaver.Member.CONSTRUCTOR,
  156. toResolvedType(aConstructor.getDeclaringClass(), (IReflectionWorld) inWorld), aConstructor.getModifiers(),
  157. // to return what BCEL returns, the return type for ctor is void
  158. UnresolvedType.VOID,// toResolvedType(aConstructor.getDeclaringClass(),(IReflectionWorld)inWorld),
  159. "<init>", toResolvedTypeArray(aConstructor.getParameterTypes(), inWorld), toResolvedTypeArray(
  160. aConstructor.getExceptionTypes(), inWorld), aConstructor);
  161. if (inWorld instanceof IReflectionWorld) {
  162. ret.setAnnotationFinder(((IReflectionWorld) inWorld).getAnnotationFinder());
  163. }
  164. ret.setGenericSignatureInformationProvider(createGenericSignatureProvider(inWorld));
  165. return ret;
  166. }
  167. public static ResolvedMember createResolvedField(Field aField, World inWorld) {
  168. ReflectionBasedResolvedMemberImpl ret = new ReflectionBasedResolvedMemberImpl(org.aspectj.weaver.Member.FIELD,
  169. toResolvedType(aField.getDeclaringClass(), (IReflectionWorld) inWorld), aField.getModifiers(), toResolvedType(
  170. aField.getType(), (IReflectionWorld) inWorld), aField.getName(), UnresolvedType.NONE, aField);
  171. if (inWorld instanceof IReflectionWorld) {
  172. ret.setAnnotationFinder(((IReflectionWorld) inWorld).getAnnotationFinder());
  173. }
  174. ret.setGenericSignatureInformationProvider(createGenericSignatureProvider(inWorld));
  175. return ret;
  176. }
  177. public static ResolvedMember createHandlerMember(Class exceptionType, Class inType, World inWorld) {
  178. return new ResolvedMemberImpl(org.aspectj.weaver.Member.HANDLER, toResolvedType(inType, (IReflectionWorld) inWorld),
  179. Modifier.STATIC, "<catch>", "(" + inWorld.resolve(exceptionType.getName()).getSignature() + ")V");
  180. }
  181. public static ResolvedType resolveTypeInWorld(Class aClass, World aWorld) {
  182. // classes that represent arrays return a class name that is the signature of the array type, ho-hum...
  183. String className = aClass.getName();
  184. if (aClass.isArray()) {
  185. return aWorld.resolve(UnresolvedType.forSignature(className.replace('.', '/')));
  186. } else {
  187. return aWorld.resolve(className);
  188. }
  189. }
  190. private static ResolvedType toResolvedType(Class aClass, IReflectionWorld aWorld) {
  191. return aWorld.resolve(aClass);
  192. }
  193. private static ResolvedType[] toResolvedTypeArray(Class[] classes, World inWorld) {
  194. ResolvedType[] ret = new ResolvedType[classes.length];
  195. for (int i = 0; i < ret.length; i++) {
  196. ret[i] = ((IReflectionWorld) inWorld).resolve(classes[i]);
  197. }
  198. return ret;
  199. }
  200. }