You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Factory.java 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. /* *******************************************************************
  2. * Copyright (c) 1999-2001 Xerox Corporation,
  3. * 2002 Palo Alto Research Center, Incorporated (PARC).
  4. * All rights reserved.
  5. * This program and the accompanying materials are made available
  6. * under the terms of the Eclipse Public License v1.0
  7. * which accompanies this distribution and is available at
  8. * http://www.eclipse.org/legal/epl-v10.html
  9. *
  10. * Contributors:
  11. * Xerox/PARC initial implementation
  12. * Alex Vasseur new factory methods for variants of JP
  13. * Abraham Nevado new factory methods for collapsed SJPs
  14. * ******************************************************************/
  15. package org.aspectj.runtime.reflect;
  16. import java.lang.reflect.Constructor;
  17. import java.lang.reflect.Member;
  18. import java.lang.reflect.Method;
  19. import java.util.Hashtable;
  20. import java.util.StringTokenizer;
  21. import org.aspectj.lang.JoinPoint;
  22. import org.aspectj.lang.Signature;
  23. import org.aspectj.lang.reflect.AdviceSignature;
  24. import org.aspectj.lang.reflect.CatchClauseSignature;
  25. import org.aspectj.lang.reflect.ConstructorSignature;
  26. import org.aspectj.lang.reflect.FieldSignature;
  27. import org.aspectj.lang.reflect.InitializerSignature;
  28. import org.aspectj.lang.reflect.LockSignature;
  29. import org.aspectj.lang.reflect.MethodSignature;
  30. import org.aspectj.lang.reflect.SourceLocation;
  31. import org.aspectj.lang.reflect.UnlockSignature;
  32. public final class Factory {
  33. Class lexicalClass;
  34. ClassLoader lookupClassLoader;
  35. String filename;
  36. int count;
  37. static Hashtable prims = new Hashtable();
  38. static {
  39. prims.put("void", Void.TYPE);
  40. prims.put("boolean", Boolean.TYPE);
  41. prims.put("byte", Byte.TYPE);
  42. prims.put("char", Character.TYPE);
  43. prims.put("short", Short.TYPE);
  44. prims.put("int", Integer.TYPE);
  45. prims.put("long", Long.TYPE);
  46. prims.put("float", Float.TYPE);
  47. prims.put("double", Double.TYPE);
  48. }
  49. static Class makeClass(String s, ClassLoader loader) {
  50. if (s.equals("*"))
  51. return null;
  52. Class ret = (Class) prims.get(s);
  53. if (ret != null)
  54. return ret;
  55. try {
  56. /*
  57. * The documentation of Class.forName explains why this is the right thing better than I could here.
  58. */
  59. if (loader == null) {
  60. return Class.forName(s);
  61. } else {
  62. // used to be 'return loader.loadClass(s)' but that didn't cause
  63. // array types to be created and loaded correctly. (pr70404)
  64. return Class.forName(s, false, loader);
  65. }
  66. } catch (ClassNotFoundException e) {
  67. // System.out.println("null for: " + s);
  68. // XXX there should be a better return value for this
  69. return ClassNotFoundException.class;
  70. }
  71. }
  72. public Factory(String filename, Class lexicalClass) {
  73. // System.out.println("making
  74. this.filename = filename;
  75. this.lexicalClass = lexicalClass;
  76. this.count = 0;
  77. lookupClassLoader = lexicalClass.getClassLoader();
  78. }
  79. /**
  80. * Create a signature and build a JoinPoint in one step. Prior to 1.6.10 this was done as a two step operation in the generated
  81. * code but merging these methods in the runtime library enables the generated code to be shorter. Generating code that
  82. * uses this method requires the weaver to be invoked with <tt>-Xset:targetRuntime1_6_10=true</tt>.
  83. *
  84. * @since 1.6.10
  85. */
  86. public JoinPoint.StaticPart makeSJP(String kind, String modifiers, String methodName, String declaringType, String paramTypes,
  87. String paramNames, String exceptionTypes, String returnType, int l) {
  88. Signature sig = this.makeMethodSig(modifiers, methodName, declaringType, paramTypes, paramNames, exceptionTypes, returnType);
  89. return new JoinPointImpl.StaticPartImpl(count++, kind, sig, makeSourceLoc(l, -1));
  90. }
  91. /**
  92. * Create a signature and build a JoinPoint in one step. Prior to 1.6.10 this was done as a two step operation in the generated
  93. * code but merging these methods in the runtime library enables the generated code to be shorter. Generating code that
  94. * uses this method requires the weaver to be invoked with <tt>-Xset:targetRuntime1_6_10=true</tt>.
  95. * <p>
  96. * This method differs from the previous one in that it includes no exceptionTypes parameter - it is an optimization for the
  97. * case where there are no exceptions. The generated code won't build an empty string and will not pass it into here.
  98. *
  99. * @since 1.6.10
  100. */
  101. public JoinPoint.StaticPart makeSJP(String kind, String modifiers, String methodName, String declaringType, String paramTypes,
  102. String paramNames, String returnType, int l) {
  103. Signature sig = this.makeMethodSig(modifiers, methodName, declaringType, paramTypes, paramNames, "", returnType);
  104. return new JoinPointImpl.StaticPartImpl(count++, kind, sig, makeSourceLoc(l, -1));
  105. }
  106. public JoinPoint.StaticPart makeSJP(String kind, Signature sig, SourceLocation loc) {
  107. return new JoinPointImpl.StaticPartImpl(count++, kind, sig, loc);
  108. }
  109. public JoinPoint.StaticPart makeSJP(String kind, Signature sig, int l, int c) {
  110. return new JoinPointImpl.StaticPartImpl(count++, kind, sig, makeSourceLoc(l, c));
  111. }
  112. public JoinPoint.StaticPart makeSJP(String kind, Signature sig, int l) {
  113. return new JoinPointImpl.StaticPartImpl(count++, kind, sig, makeSourceLoc(l, -1));
  114. }
  115. public JoinPoint.EnclosingStaticPart makeESJP(String kind, Signature sig, SourceLocation loc) {
  116. return new JoinPointImpl.EnclosingStaticPartImpl(count++, kind, sig, loc);
  117. }
  118. public JoinPoint.EnclosingStaticPart makeESJP(String kind, Signature sig, int l, int c) {
  119. return new JoinPointImpl.EnclosingStaticPartImpl(count++, kind, sig, makeSourceLoc(l, c));
  120. }
  121. public JoinPoint.EnclosingStaticPart makeESJP(String kind, Signature sig, int l) {
  122. return new JoinPointImpl.EnclosingStaticPartImpl(count++, kind, sig, makeSourceLoc(l, -1));
  123. }
  124. public static JoinPoint.StaticPart makeEncSJP(Member member) {
  125. Signature sig = null;
  126. String kind = null;
  127. if (member instanceof Method) {
  128. Method method = (Method) member;
  129. sig = new MethodSignatureImpl(method.getModifiers(), method.getName(), method.getDeclaringClass(), method
  130. .getParameterTypes(), new String[method.getParameterTypes().length], method.getExceptionTypes(), method
  131. .getReturnType());
  132. kind = JoinPoint.METHOD_EXECUTION;
  133. } else if (member instanceof Constructor) {
  134. Constructor cons = (Constructor) member;
  135. sig = new ConstructorSignatureImpl(cons.getModifiers(), cons.getDeclaringClass(), cons.getParameterTypes(),
  136. new String[cons.getParameterTypes().length], cons.getExceptionTypes());
  137. kind = JoinPoint.CONSTRUCTOR_EXECUTION;
  138. } else {
  139. throw new IllegalArgumentException("member must be either a method or constructor");
  140. }
  141. return new JoinPointImpl.EnclosingStaticPartImpl(-1, kind, sig, null);
  142. }
  143. private static Object[] NO_ARGS = new Object[0];
  144. public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, Object _this, Object target) {
  145. return new JoinPointImpl(staticPart, _this, target, NO_ARGS);
  146. }
  147. public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, Object _this, Object target, Object arg0) {
  148. return new JoinPointImpl(staticPart, _this, target, new Object[] { arg0 });
  149. }
  150. public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, Object _this, Object target, Object arg0, Object arg1) {
  151. return new JoinPointImpl(staticPart, _this, target, new Object[] { arg0, arg1 });
  152. }
  153. public static JoinPoint makeJP(JoinPoint.StaticPart staticPart, Object _this, Object target, Object[] args) {
  154. return new JoinPointImpl(staticPart, _this, target, args);
  155. }
  156. public MethodSignature makeMethodSig(String stringRep) {
  157. MethodSignatureImpl ret = new MethodSignatureImpl(stringRep);
  158. ret.setLookupClassLoader(lookupClassLoader);
  159. return ret;
  160. }
  161. public MethodSignature makeMethodSig(String modifiers, String methodName, String declaringType, String paramTypes,
  162. String paramNames, String exceptionTypes, String returnType) {
  163. int modifiersAsInt = Integer.parseInt(modifiers, 16);
  164. Class declaringTypeClass = makeClass(declaringType, lookupClassLoader);
  165. StringTokenizer st = new StringTokenizer(paramTypes, ":");
  166. int numParams = st.countTokens();
  167. Class[] paramTypeClasses = new Class[numParams];
  168. for (int i = 0; i < numParams; i++)
  169. paramTypeClasses[i] = makeClass(st.nextToken(), lookupClassLoader);
  170. st = new StringTokenizer(paramNames, ":");
  171. numParams = st.countTokens();
  172. String[] paramNamesArray = new String[numParams];
  173. for (int i = 0; i < numParams; i++)
  174. paramNamesArray[i] = st.nextToken();
  175. st = new StringTokenizer(exceptionTypes, ":");
  176. numParams = st.countTokens();
  177. Class[] exceptionTypeClasses = new Class[numParams];
  178. for (int i = 0; i < numParams; i++)
  179. exceptionTypeClasses[i] = makeClass(st.nextToken(), lookupClassLoader);
  180. Class returnTypeClass = makeClass(returnType, lookupClassLoader);
  181. MethodSignatureImpl ret = new MethodSignatureImpl(modifiersAsInt, methodName, declaringTypeClass, paramTypeClasses,
  182. paramNamesArray, exceptionTypeClasses, returnTypeClass);
  183. return ret;
  184. }
  185. public MethodSignature makeMethodSig(int modifiers, String name, Class declaringType, Class[] parameterTypes,
  186. String[] parameterNames, Class[] exceptionTypes, Class returnType) {
  187. MethodSignatureImpl ret = new MethodSignatureImpl(modifiers, name, declaringType, parameterTypes, parameterNames,
  188. exceptionTypes, returnType);
  189. ret.setLookupClassLoader(lookupClassLoader);
  190. return ret;
  191. }
  192. public ConstructorSignature makeConstructorSig(String stringRep) {
  193. ConstructorSignatureImpl ret = new ConstructorSignatureImpl(stringRep);
  194. ret.setLookupClassLoader(lookupClassLoader);
  195. return ret;
  196. }
  197. public ConstructorSignature makeConstructorSig(String modifiers, String declaringType, String paramTypes, String paramNames,
  198. String exceptionTypes) {
  199. int modifiersAsInt = Integer.parseInt(modifiers, 16);
  200. Class declaringTypeClass = makeClass(declaringType, lookupClassLoader);
  201. StringTokenizer st = new StringTokenizer(paramTypes, ":");
  202. int numParams = st.countTokens();
  203. Class[] paramTypeClasses = new Class[numParams];
  204. for (int i = 0; i < numParams; i++)
  205. paramTypeClasses[i] = makeClass(st.nextToken(), lookupClassLoader);
  206. st = new StringTokenizer(paramNames, ":");
  207. numParams = st.countTokens();
  208. String[] paramNamesArray = new String[numParams];
  209. for (int i = 0; i < numParams; i++)
  210. paramNamesArray[i] = st.nextToken();
  211. st = new StringTokenizer(exceptionTypes, ":");
  212. numParams = st.countTokens();
  213. Class[] exceptionTypeClasses = new Class[numParams];
  214. for (int i = 0; i < numParams; i++)
  215. exceptionTypeClasses[i] = makeClass(st.nextToken(), lookupClassLoader);
  216. ConstructorSignatureImpl ret = new ConstructorSignatureImpl(modifiersAsInt, declaringTypeClass, paramTypeClasses,
  217. paramNamesArray, exceptionTypeClasses);
  218. ret.setLookupClassLoader(lookupClassLoader);
  219. return ret;
  220. }
  221. public ConstructorSignature makeConstructorSig(int modifiers, Class declaringType, Class[] parameterTypes,
  222. String[] parameterNames, Class[] exceptionTypes) {
  223. ConstructorSignatureImpl ret = new ConstructorSignatureImpl(modifiers, declaringType, parameterTypes, parameterNames,
  224. exceptionTypes);
  225. ret.setLookupClassLoader(lookupClassLoader);
  226. return ret;
  227. }
  228. public FieldSignature makeFieldSig(String stringRep) {
  229. FieldSignatureImpl ret = new FieldSignatureImpl(stringRep);
  230. ret.setLookupClassLoader(lookupClassLoader);
  231. return ret;
  232. }
  233. public FieldSignature makeFieldSig(String modifiers, String name, String declaringType, String fieldType) {
  234. int modifiersAsInt = Integer.parseInt(modifiers, 16);
  235. Class declaringTypeClass = makeClass(declaringType, lookupClassLoader);
  236. Class fieldTypeClass = makeClass(fieldType, lookupClassLoader);
  237. FieldSignatureImpl ret = new FieldSignatureImpl(modifiersAsInt, name, declaringTypeClass, fieldTypeClass);
  238. ret.setLookupClassLoader(lookupClassLoader);
  239. return ret;
  240. }
  241. public FieldSignature makeFieldSig(int modifiers, String name, Class declaringType, Class fieldType) {
  242. FieldSignatureImpl ret = new FieldSignatureImpl(modifiers, name, declaringType, fieldType);
  243. ret.setLookupClassLoader(lookupClassLoader);
  244. return ret;
  245. }
  246. public AdviceSignature makeAdviceSig(String stringRep) {
  247. AdviceSignatureImpl ret = new AdviceSignatureImpl(stringRep);
  248. ret.setLookupClassLoader(lookupClassLoader);
  249. return ret;
  250. }
  251. public AdviceSignature makeAdviceSig(String modifiers, String name, String declaringType, String paramTypes, String paramNames,
  252. String exceptionTypes, String returnType) {
  253. int modifiersAsInt = Integer.parseInt(modifiers, 16);
  254. Class declaringTypeClass = makeClass(declaringType, lookupClassLoader);
  255. StringTokenizer st = new StringTokenizer(paramTypes, ":");
  256. int numParams = st.countTokens();
  257. Class[] paramTypeClasses = new Class[numParams];
  258. for (int i = 0; i < numParams; i++)
  259. paramTypeClasses[i] = makeClass(st.nextToken(), lookupClassLoader);
  260. st = new StringTokenizer(paramNames, ":");
  261. numParams = st.countTokens();
  262. String[] paramNamesArray = new String[numParams];
  263. for (int i = 0; i < numParams; i++)
  264. paramNamesArray[i] = st.nextToken();
  265. st = new StringTokenizer(exceptionTypes, ":");
  266. numParams = st.countTokens();
  267. Class[] exceptionTypeClasses = new Class[numParams];
  268. for (int i = 0; i < numParams; i++)
  269. exceptionTypeClasses[i] = makeClass(st.nextToken(), lookupClassLoader);
  270. ;
  271. Class returnTypeClass = makeClass(returnType, lookupClassLoader);
  272. AdviceSignatureImpl ret = new AdviceSignatureImpl(modifiersAsInt, name, declaringTypeClass, paramTypeClasses,
  273. paramNamesArray, exceptionTypeClasses, returnTypeClass);
  274. ret.setLookupClassLoader(lookupClassLoader);
  275. return ret;
  276. }
  277. public AdviceSignature makeAdviceSig(int modifiers, String name, Class declaringType, Class[] parameterTypes,
  278. String[] parameterNames, Class[] exceptionTypes, Class returnType) {
  279. AdviceSignatureImpl ret = new AdviceSignatureImpl(modifiers, name, declaringType, parameterTypes, parameterNames,
  280. exceptionTypes, returnType);
  281. ret.setLookupClassLoader(lookupClassLoader);
  282. return ret;
  283. }
  284. public InitializerSignature makeInitializerSig(String stringRep) {
  285. InitializerSignatureImpl ret = new InitializerSignatureImpl(stringRep);
  286. ret.setLookupClassLoader(lookupClassLoader);
  287. return ret;
  288. }
  289. public InitializerSignature makeInitializerSig(String modifiers, String declaringType) {
  290. int modifiersAsInt = Integer.parseInt(modifiers, 16);
  291. Class declaringTypeClass = makeClass(declaringType, lookupClassLoader);
  292. InitializerSignatureImpl ret = new InitializerSignatureImpl(modifiersAsInt, declaringTypeClass);
  293. ret.setLookupClassLoader(lookupClassLoader);
  294. return ret;
  295. }
  296. public InitializerSignature makeInitializerSig(int modifiers, Class declaringType) {
  297. InitializerSignatureImpl ret = new InitializerSignatureImpl(modifiers, declaringType);
  298. ret.setLookupClassLoader(lookupClassLoader);
  299. return ret;
  300. }
  301. public CatchClauseSignature makeCatchClauseSig(String stringRep) {
  302. CatchClauseSignatureImpl ret = new CatchClauseSignatureImpl(stringRep);
  303. ret.setLookupClassLoader(lookupClassLoader);
  304. return ret;
  305. }
  306. public CatchClauseSignature makeCatchClauseSig(String declaringType, String parameterType, String parameterName) {
  307. Class declaringTypeClass = makeClass(declaringType, lookupClassLoader);
  308. StringTokenizer st = new StringTokenizer(parameterType, ":");
  309. Class parameterTypeClass = makeClass(st.nextToken(), lookupClassLoader);
  310. st = new StringTokenizer(parameterName, ":");
  311. String parameterNameForReturn = st.nextToken();
  312. CatchClauseSignatureImpl ret = new CatchClauseSignatureImpl(declaringTypeClass, parameterTypeClass, parameterNameForReturn);
  313. ret.setLookupClassLoader(lookupClassLoader);
  314. return ret;
  315. }
  316. public CatchClauseSignature makeCatchClauseSig(Class declaringType, Class parameterType, String parameterName) {
  317. CatchClauseSignatureImpl ret = new CatchClauseSignatureImpl(declaringType, parameterType, parameterName);
  318. ret.setLookupClassLoader(lookupClassLoader);
  319. return ret;
  320. }
  321. public LockSignature makeLockSig(String stringRep) {
  322. LockSignatureImpl ret = new LockSignatureImpl(stringRep);
  323. ret.setLookupClassLoader(lookupClassLoader);
  324. return ret;
  325. }
  326. public LockSignature makeLockSig() {
  327. Class declaringTypeClass = makeClass("Ljava/lang/Object;", lookupClassLoader);
  328. LockSignatureImpl ret = new LockSignatureImpl(declaringTypeClass);
  329. ret.setLookupClassLoader(lookupClassLoader);
  330. return ret;
  331. }
  332. public LockSignature makeLockSig(Class declaringType) {
  333. LockSignatureImpl ret = new LockSignatureImpl(declaringType);
  334. ret.setLookupClassLoader(lookupClassLoader);
  335. return ret;
  336. }
  337. public UnlockSignature makeUnlockSig(String stringRep) {
  338. UnlockSignatureImpl ret = new UnlockSignatureImpl(stringRep);
  339. ret.setLookupClassLoader(lookupClassLoader);
  340. return ret;
  341. }
  342. public UnlockSignature makeUnlockSig() {
  343. Class declaringTypeClass = makeClass("Ljava/lang/Object;", lookupClassLoader);
  344. UnlockSignatureImpl ret = new UnlockSignatureImpl(declaringTypeClass);
  345. ret.setLookupClassLoader(lookupClassLoader);
  346. return ret;
  347. }
  348. public UnlockSignature makeUnlockSig(Class declaringType) {
  349. UnlockSignatureImpl ret = new UnlockSignatureImpl(declaringType);
  350. ret.setLookupClassLoader(lookupClassLoader);
  351. return ret;
  352. }
  353. public SourceLocation makeSourceLoc(int line, int col) {
  354. return new SourceLocationImpl(lexicalClass, this.filename, line);
  355. }
  356. }