From e1f6d1fc52d329b018ed11c08cab5011f267c3d0 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Tue, 26 May 2015 15:12:55 -0700 Subject: [PATCH] allow reflection world to resolve generated types (e.g. lambdas) 1.8.6 release prep 1.8.6 pom updates Fix rogue chars in javadoc rebuilt with javadoc fixes --- .../apache/bcel/classfile/StackMap.java | 2 +- .../apache/bcel/classfile/StackMapEntry.java | 2 +- .../apache/bcel/generic/ObjectType.java | 2 +- .../apache/bcel/generic/ReferenceType.java | 16 +-- .../bcel/generic/ReturnaddressType.java | 2 +- build/usedForMavenUpload/aspectjrt.pom | 2 +- build/usedForMavenUpload/aspectjtools.pom | 2 +- build/usedForMavenUpload/aspectjweaver.pom | 2 +- .../usedForMavenUpload_release/aspectjrt.pom | 2 +- .../aspectjtools.pom | 2 +- .../aspectjweaver.pom | 2 +- docs/dist/doc/README-186.html | 36 +++++ docs/dist/doc/index.html | 1 + lib/bcel/bcel-src.zip | Bin 326882 -> 326864 bytes lib/bcel/bcel.jar | Bin 285242 -> 285242 bytes ...ointcutDesignatorHandlerBasedPointcut.java | 26 +++- .../tools/PointcutExpressionImpl.java | 7 + .../ReflectionBasedReferenceTypeDelegate.java | 4 + ...tionBasedReferenceTypeDelegateFactory.java | 11 ++ .../weaver/reflect/ReflectionWorld.java | 47 ++++++- tests/.classpath | 1 + tests/bugs186/lambdaBeans/Application.java | 16 +++ tests/bugs186/lambdaBeans/Foo.java | 4 + .../systemtest/ajc186/Ajc186Tests.java | 123 +++++++++++++++++- .../org/aspectj/systemtest/ajc186/ajc186.xml | 5 + 25 files changed, 288 insertions(+), 29 deletions(-) create mode 100644 docs/dist/doc/README-186.html create mode 100644 tests/bugs186/lambdaBeans/Application.java create mode 100644 tests/bugs186/lambdaBeans/Foo.java diff --git a/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMap.java b/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMap.java index 80f943bbf..29f9c1535 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMap.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMap.java @@ -63,7 +63,7 @@ import org.aspectj.apache.bcel.Constants; /** * This class represents a stack map attribute used for preverification of Java classes for the * Java 2 Micro Edition (J2ME). This attribute is used by the KVM and contained - * within the Code attribute of a method. See CLDC specification §5.3.1.2 + * within the Code attribute of a method. See CLDC specification 5.3.1.2 * * @version $Id: StackMap.java,v 1.6 2009/09/15 19:40:12 aclement Exp $ * @author M. Dahm diff --git a/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMapEntry.java b/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMapEntry.java index b369083fb..76bb2ab79 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMapEntry.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/classfile/StackMapEntry.java @@ -61,7 +61,7 @@ import java.io.IOException; /** * This class represents a stack map entry recording the types of * local variables and the the of stack items at a given byte code offset. - * See CLDC specification §5.3.1.2 + * See CLDC specification 5.3.1.2 * * @version $Id: StackMapEntry.java,v 1.5 2008/05/28 23:53:02 aclement Exp $ * @author M. Dahm diff --git a/bcel-builder/src/org/aspectj/apache/bcel/generic/ObjectType.java b/bcel-builder/src/org/aspectj/apache/bcel/generic/ObjectType.java index 95e467529..544363f16 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/generic/ObjectType.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/generic/ObjectType.java @@ -146,7 +146,7 @@ public class ObjectType extends ReferenceType { } /** - * Java Virtual Machine Specification edition 2, § 5.4.4 Access Control + * Java Virtual Machine Specification edition 2, 5.4.4 Access Control */ public boolean accessibleTo(ObjectType accessor) { JavaClass jc = Repository.lookupClass(classname); diff --git a/bcel-builder/src/org/aspectj/apache/bcel/generic/ReferenceType.java b/bcel-builder/src/org/aspectj/apache/bcel/generic/ReferenceType.java index ae3be0c00..1e290f5a4 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/generic/ReferenceType.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/generic/ReferenceType.java @@ -137,7 +137,7 @@ public abstract class ReferenceType extends Type { */ if (this instanceof ObjectType && ((ObjectType) this).referencesInterface()) { /* - * If T is a class type, then T must be Object (§2.4.7). + * If T is a class type, then T must be Object (2.4.7). */ if (T instanceof ObjectType && ((ObjectType) T).referencesClass()) { if (T.equals(Type.OBJECT)) { @@ -146,7 +146,7 @@ public abstract class ReferenceType extends Type { } /* - * If T is an interface type, then T must be the same interface as this or a superinterface of this (§2.13.2). + * If T is an interface type, then T must be the same interface as this or a superinterface of this (2.13.2). */ if (T instanceof ObjectType && ((ObjectType) T).referencesInterface()) { if (this.equals(T)) { @@ -163,7 +163,7 @@ public abstract class ReferenceType extends Type { */ if (this instanceof ArrayType) { /* - * If T is a class type, then T must be Object (§2.4.7). + * If T is a class type, then T must be Object (2.4.7). */ if (T instanceof ObjectType && ((ObjectType) T).referencesClass()) { if (T.equals(Type.OBJECT)) { @@ -176,7 +176,7 @@ public abstract class ReferenceType extends Type { */ if (T instanceof ArrayType) { /* - * TC and SC are the same primitive type (§2.4.1). + * TC and SC are the same primitive type (2.4.1). */ Type sc = ((ArrayType) this).getElementType(); Type tc = ((ArrayType) this).getElementType(); @@ -186,7 +186,7 @@ public abstract class ReferenceType extends Type { } /* - * TC and SC are reference types (§2.4.6), and type SC is assignable to TC by these runtime rules. + * TC and SC are reference types (2.4.6), and type SC is assignable to TC by these runtime rules. */ if (tc instanceof ReferenceType && sc instanceof ReferenceType && ((ReferenceType) sc).isAssignmentCompatibleWith(tc)) { @@ -194,7 +194,7 @@ public abstract class ReferenceType extends Type { } } - /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ + /* If T is an interface type, T must be one of the interfaces implemented by arrays (2.15). */ // TODO: Check if this is still valid or find a way to dynamically find out which // interfaces arrays implement. However, as of the JVM specification edition 2, there // are at least two different pages where assignment compatibility is defined and @@ -218,7 +218,7 @@ public abstract class ReferenceType extends Type { * t is an ArrayType, then Type.OBJECT is returned; unless their dimensions match. Then an ArrayType of the same number of * dimensions is returned, with its basic type being the first common super class of the basic types of "this" and t. If "this" * or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. If not all of the two classes' superclasses - * cannot be found, "null" is returned. See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * cannot be found, "null" is returned. See the JVM specification edition 2, "4.9.2 The Bytecode Verifier". */ public ReferenceType getFirstCommonSuperclass(ReferenceType t) { if (this.equals(Type.NULL)) { @@ -300,7 +300,7 @@ public abstract class ReferenceType extends Type { // * t is an ArrayType, then Type.OBJECT is returned. If "this" or t is a ReferenceType referencing an interface, then // Type.OBJECT // * is returned. If not all of the two classes' superclasses cannot be found, "null" is returned. See the JVM specification - // * edition 2, "§4.9.2 The Bytecode Verifier". + // * edition 2, "4.9.2 The Bytecode Verifier". // * // * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has slightly changed semantics. // */ diff --git a/bcel-builder/src/org/aspectj/apache/bcel/generic/ReturnaddressType.java b/bcel-builder/src/org/aspectj/apache/bcel/generic/ReturnaddressType.java index 45ffae9b7..a38ffedfd 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/generic/ReturnaddressType.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/generic/ReturnaddressType.java @@ -59,7 +59,7 @@ import org.aspectj.apache.bcel.generic.InstructionHandle; /** * Returnaddress, the type JSR or JSR_W instructions push upon the stack. * - * see vmspec2 §3.3.3 + * see vmspec2 3.3.3 * @version $Id: ReturnaddressType.java,v 1.3 2008/05/28 23:52:56 aclement Exp $ * @author Enver Haase */ diff --git a/build/usedForMavenUpload/aspectjrt.pom b/build/usedForMavenUpload/aspectjrt.pom index 25c6146d7..5178898a6 100644 --- a/build/usedForMavenUpload/aspectjrt.pom +++ b/build/usedForMavenUpload/aspectjrt.pom @@ -5,7 +5,7 @@ org.aspectj aspectjrt jar - 1.8.4.BUILD-SNAPSHOT + 1.8.6.BUILD-SNAPSHOT AspectJ runtime The runtime needed to execute a program using AspectJ http://www.aspectj.org diff --git a/build/usedForMavenUpload/aspectjtools.pom b/build/usedForMavenUpload/aspectjtools.pom index defa88acf..2c536f4fc 100644 --- a/build/usedForMavenUpload/aspectjtools.pom +++ b/build/usedForMavenUpload/aspectjtools.pom @@ -5,7 +5,7 @@ org.aspectj aspectjtools jar - 1.8.4.BUILD-SNAPSHOT + 1.8.6.BUILD-SNAPSHOT AspectJ tools Tools from the AspectJ project http://www.aspectj.org diff --git a/build/usedForMavenUpload/aspectjweaver.pom b/build/usedForMavenUpload/aspectjweaver.pom index ad82e4093..d681a3e73 100644 --- a/build/usedForMavenUpload/aspectjweaver.pom +++ b/build/usedForMavenUpload/aspectjweaver.pom @@ -5,7 +5,7 @@ org.aspectj aspectjweaver jar - 1.8.4.BUILD-SNAPSHOT + 1.8.6.BUILD-SNAPSHOT AspectJ weaver The AspectJ weaver introduces advices to java classes http://www.aspectj.org diff --git a/build/usedForMavenUpload_release/aspectjrt.pom b/build/usedForMavenUpload_release/aspectjrt.pom index 2cb2521e1..f745bce1f 100644 --- a/build/usedForMavenUpload_release/aspectjrt.pom +++ b/build/usedForMavenUpload_release/aspectjrt.pom @@ -5,7 +5,7 @@ org.aspectj aspectjrt jar - 1.8.4 + 1.8.6 AspectJ runtime The runtime needed to execute a program using AspectJ http://www.aspectj.org diff --git a/build/usedForMavenUpload_release/aspectjtools.pom b/build/usedForMavenUpload_release/aspectjtools.pom index f78b536cd..50526540a 100644 --- a/build/usedForMavenUpload_release/aspectjtools.pom +++ b/build/usedForMavenUpload_release/aspectjtools.pom @@ -5,7 +5,7 @@ org.aspectj aspectjtools jar - 1.8.4 + 1.8.6 AspectJ tools Tools from the AspectJ project http://www.aspectj.org diff --git a/build/usedForMavenUpload_release/aspectjweaver.pom b/build/usedForMavenUpload_release/aspectjweaver.pom index e4ffc6e1b..d9d49848f 100644 --- a/build/usedForMavenUpload_release/aspectjweaver.pom +++ b/build/usedForMavenUpload_release/aspectjweaver.pom @@ -5,7 +5,7 @@ org.aspectj aspectjweaver jar - 1.8.4 + 1.8.6 AspectJ weaver The AspectJ weaver introduces advices to java classes http://www.aspectj.org diff --git a/docs/dist/doc/README-186.html b/docs/dist/doc/README-186.html new file mode 100644 index 000000000..e9d57f5f8 --- /dev/null +++ b/docs/dist/doc/README-186.html @@ -0,0 +1,36 @@ + + +AspectJ 1.8.6 Readme + + + + +
+© Copyright 2015 Contributors. +All rights reserved. +
+ +

AspectJ 1.8.6 Readme

+ +

The full list of resolved issues in 1.8.6 is available +here.

+ + + + + + + + diff --git a/docs/dist/doc/index.html b/docs/dist/doc/index.html index fabaf0d0a..a3167b50a 100644 --- a/docs/dist/doc/index.html +++ b/docs/dist/doc/index.html @@ -138,6 +138,7 @@ README's Changes and porting guide for AspectJ + 1.8.6, 1.8.5, 1.8.4, 1.8.3, diff --git a/lib/bcel/bcel-src.zip b/lib/bcel/bcel-src.zip index 3881b662f7f0342c8e319283fc0f91d8e2773e10..6e51d79162032b80dd68e6b4d4ae40b69ab88c1f 100644 GIT binary patch delta 14582 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 WsPiA5=mg?|N8d5b`4I5k4gU{hqJcU9 delta 14456 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 diff --git a/lib/bcel/bcel.jar b/lib/bcel/bcel.jar index 0126d477e24340a9a90f1834f7ab39fa47c737ec..040e5d0b5ecbefc5f31c8de65b0046656f910b34 100644 GIT binary patch delta 116 zcmdnBMR3;^!GZd38vBZIuAM|6X G(l delta 121 zcmdnBMR3;^!GEHiM1fh``Hfj-Nx!vFvP diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutDesignatorHandlerBasedPointcut.java b/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutDesignatorHandlerBasedPointcut.java index 9c508a1a3..e5672dede 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutDesignatorHandlerBasedPointcut.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutDesignatorHandlerBasedPointcut.java @@ -17,6 +17,8 @@ import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.CompressingDataOutputStream; import org.aspectj.weaver.IntMap; +import org.aspectj.weaver.ReferenceType; +import org.aspectj.weaver.ReferenceTypeDelegate; import org.aspectj.weaver.ResolvedType; import org.aspectj.weaver.Shadow; import org.aspectj.weaver.World; @@ -28,6 +30,7 @@ import org.aspectj.weaver.patterns.FastMatchInfo; import org.aspectj.weaver.patterns.IScope; import org.aspectj.weaver.patterns.PatternNodeVisitor; import org.aspectj.weaver.patterns.Pointcut; +import org.aspectj.weaver.reflect.ReflectionBasedReferenceTypeDelegate; import org.aspectj.weaver.reflect.ReflectionFastMatchInfo; import org.aspectj.weaver.reflect.ReflectionShadow; import org.aspectj.weaver.reflect.ReflectionWorld; @@ -64,16 +67,25 @@ public class PointcutDesignatorHandlerBasedPointcut extends Pointcut { */ public FuzzyBoolean fastMatch(FastMatchInfo info) { if (info instanceof ReflectionFastMatchInfo) { + // Really need a reflectionworld here... + if (!(world instanceof ReflectionWorld)) { + throw new IllegalStateException("Can only match user-extension pcds with a ReflectionWorld"); + } + Class clazz = null; try { - // Really need a reflectionworld here... - if (!(world instanceof ReflectionWorld)) { - throw new IllegalStateException("Can only match user-extension pcds with a ReflectionWorld"); - } - return FuzzyBoolean.fromBoolean(this.matcher.couldMatchJoinPointsInType(Class.forName(info.getType().getName(), - false, ((ReflectionWorld) world).getClassLoader()), ((ReflectionFastMatchInfo) info).getMatchingContext())); - } catch (ClassNotFoundException cnfEx) { + clazz = Class.forName(info.getType().getName(), false, ((ReflectionWorld) world).getClassLoader()); + } catch (ClassNotFoundException cnfe) { + if (info.getType() instanceof ReferenceType) { + ReferenceTypeDelegate rtd = ((ReferenceType)info.getType()).getDelegate(); + if (rtd instanceof ReflectionBasedReferenceTypeDelegate) { + clazz = ((ReflectionBasedReferenceTypeDelegate)rtd).getClazz(); + } + } + } + if (clazz == null) { return FuzzyBoolean.MAYBE; } + return FuzzyBoolean.fromBoolean(this.matcher.couldMatchJoinPointsInType(clazz, ((ReflectionFastMatchInfo) info).getMatchingContext())); } throw new IllegalStateException("Can only match user-extension pcds against Reflection FastMatchInfo objects"); } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutExpressionImpl.java b/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutExpressionImpl.java index 1869e9b19..822c78d9a 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutExpressionImpl.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/internal/tools/PointcutExpressionImpl.java @@ -35,6 +35,7 @@ import org.aspectj.weaver.patterns.WithinAnnotationPointcut; import org.aspectj.weaver.patterns.WithinCodeAnnotationPointcut; import org.aspectj.weaver.reflect.ReflectionFastMatchInfo; import org.aspectj.weaver.reflect.ReflectionShadow; +import org.aspectj.weaver.reflect.ReflectionWorld; import org.aspectj.weaver.reflect.ShadowMatchImpl; import org.aspectj.weaver.tools.DefaultMatchingContext; import org.aspectj.weaver.tools.MatchingContext; @@ -80,6 +81,12 @@ public class PointcutExpressionImpl implements PointcutExpression { public boolean couldMatchJoinPointsInType(Class aClass) { ResolvedType matchType = world.resolve(aClass.getName()); + if (matchType.isMissing() && (world instanceof ReflectionWorld)) { + // Class is a generated class that cannot be 'looked up' via getResource. + // For example a proxy or lambda. + // Use the class itself in this case + matchType = ((ReflectionWorld)world).resolveUsingClass(aClass); + } ReflectionFastMatchInfo info = new ReflectionFastMatchInfo(matchType, null, this.matchContext, world); boolean couldMatch = pointcut.fastMatch(info).maybeTrue(); if (MATCH_INFO) { diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java index 988239e98..6110e6ceb 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java @@ -69,6 +69,10 @@ public class ReflectionBasedReferenceTypeDelegate implements ReferenceTypeDelega this.classLoaderReference = new WeakClassLoaderReference((aClassLoader != null) ? aClassLoader : bootClassLoader); } + public Class getClazz() { + return this.myClass; + } + protected Class getBaseClass() { return this.myClass; } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateFactory.java b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateFactory.java index e1d709dfc..eee1b6f32 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateFactory.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateFactory.java @@ -47,6 +47,17 @@ public class ReflectionBasedReferenceTypeDelegateFactory { return null; } } + + public static ReflectionBasedReferenceTypeDelegate createDelegate(ReferenceType forReferenceType, World inWorld, + Class clazz) { + if (LangUtil.is15VMOrGreater()) { + ReflectionBasedReferenceTypeDelegate rbrtd = create15Delegate(forReferenceType, clazz, clazz.getClassLoader(), inWorld); + if (rbrtd != null) { + return rbrtd; // can be null if we didn't find the class the delegate logic loads + } + } + return new ReflectionBasedReferenceTypeDelegate(clazz, clazz.getClassLoader(), inWorld, forReferenceType); + } public static ReflectionBasedReferenceTypeDelegate create14Delegate(ReferenceType forReferenceType, World inWorld, ClassLoader usingClassLoader) { diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionWorld.java b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionWorld.java index 64b8d4bb0..98e800222 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionWorld.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionWorld.java @@ -11,6 +11,9 @@ * ******************************************************************/ package org.aspectj.weaver.reflect; +import java.util.HashMap; +import java.util.Map; + import org.aspectj.bridge.AbortException; import org.aspectj.bridge.IMessage; import org.aspectj.bridge.IMessageHandler; @@ -34,6 +37,7 @@ public class ReflectionWorld extends World implements IReflectionWorld { private WeakClassLoaderReference classLoaderReference; private AnnotationFinder annotationFinder; private boolean mustUseOneFourDelegates = false; // for testing + private Map> inProgressResolutionClasses = new HashMap>(); private ReflectionWorld() { // super(); @@ -105,13 +109,52 @@ public class ReflectionWorld extends World implements IReflectionWorld { return world.resolve(className); } } + + /** + * Resolve a type using the specified class. Normal resolution in a reflection + * world uses Class.forName() via the classloader (attached to this world) + * in order to find a named type then builds a reference type and a reference + * type delegate based on that. For some classes generated at runtime (e.g. + * proxy or lambda representation) the forName() call will not work. In those + * situations we should just use the clazz we have. + * + * Should the whole thing switch from using forName() to using the clazz objects? + * Possibly but that introduces a lot of change and we don't have a lot + * of test coverage for this scenario (reflection world). What we are doing + * right now is that this can optionally be used if the regular resolution + * scheme did not work. + * + * Although AspectJ is *not* multi threaded or re-entrant, Spring doesn't + * always respect that. There might be an issue here if two attempts are + * made to resolve the same thing at the same time via this method. + * + * @param clazz the class to use as the delegate for the resolved type + */ + public ResolvedType resolveUsingClass(Class clazz) { + String signature = UnresolvedType.forName(clazz.getName()).getSignature(); + try { + inProgressResolutionClasses.put(signature, clazz); + return resolve(clazz.getName()); + } finally { + inProgressResolutionClasses.remove(signature); + } + } protected ReferenceTypeDelegate resolveDelegate(ReferenceType ty) { + ReferenceTypeDelegate result; if (mustUseOneFourDelegates) { - return ReflectionBasedReferenceTypeDelegateFactory.create14Delegate(ty, this, classLoaderReference.getClassLoader()); + result = ReflectionBasedReferenceTypeDelegateFactory.create14Delegate(ty, this, classLoaderReference.getClassLoader()); } else { - return ReflectionBasedReferenceTypeDelegateFactory.createDelegate(ty, this, classLoaderReference.getClassLoader()); + result = ReflectionBasedReferenceTypeDelegateFactory.createDelegate(ty, this, classLoaderReference.getClassLoader()); + } + if (result == null && inProgressResolutionClasses.size() != 0) { + // Is it a class that cannot be loaded (i.e. it was generated) but we already know about? + Class clazz = inProgressResolutionClasses.get(ty.getSignature()); + if (clazz != null) { + result = ReflectionBasedReferenceTypeDelegateFactory.createDelegate(ty,this,clazz); + } } + return result; } public static class ReflectionWorldException extends RuntimeException { diff --git a/tests/.classpath b/tests/.classpath index 864376023..bd87c250e 100644 --- a/tests/.classpath +++ b/tests/.classpath @@ -17,5 +17,6 @@ + diff --git a/tests/bugs186/lambdaBeans/Application.java b/tests/bugs186/lambdaBeans/Application.java new file mode 100644 index 000000000..f98a49a5e --- /dev/null +++ b/tests/bugs186/lambdaBeans/Application.java @@ -0,0 +1,16 @@ +public class Application { + + @Foo + Runnable fromInnerClass() { + return new Runnable() { + @Override + public void run() { + } + }; + } + + @Foo + Runnable fromLambdaExpression() { + return () -> { }; + } +} diff --git a/tests/bugs186/lambdaBeans/Foo.java b/tests/bugs186/lambdaBeans/Foo.java new file mode 100644 index 000000000..60e42f6e2 --- /dev/null +++ b/tests/bugs186/lambdaBeans/Foo.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@interface Foo {} diff --git a/tests/src/org/aspectj/systemtest/ajc186/Ajc186Tests.java b/tests/src/org/aspectj/systemtest/ajc186/Ajc186Tests.java index aeb6c1621..1625f96d1 100644 --- a/tests/src/org/aspectj/systemtest/ajc186/Ajc186Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc186/Ajc186Tests.java @@ -11,20 +11,139 @@ package org.aspectj.systemtest.ajc186; import java.io.File; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; import junit.framework.Test; import org.aspectj.testing.XMLBasedAjcTestCase; +import org.aspectj.weaver.tools.ContextBasedMatcher; +import org.aspectj.weaver.tools.DefaultMatchingContext; +import org.aspectj.weaver.tools.FuzzyBoolean; +import org.aspectj.weaver.tools.MatchingContext; +import org.aspectj.weaver.tools.PointcutDesignatorHandler; +import org.aspectj.weaver.tools.PointcutExpression; +import org.aspectj.weaver.tools.PointcutParser; /** * @author Andy Clement */ public class Ajc186Tests extends org.aspectj.testing.XMLBasedAjcTestCase { + private class FooDesignatorHandler implements PointcutDesignatorHandler { + + private String askedToParse; + public boolean simulateDynamicTest = false; + + public String getDesignatorName() { + return "foo"; + } + + public ContextBasedMatcher parse(String expression) { + this.askedToParse = expression; + return new FooPointcutExpression(expression, this.simulateDynamicTest); + } + + public String getExpressionLastAskedToParse() { + return this.askedToParse; + } + } + + private class FooPointcutExpression implements ContextBasedMatcher { + + private final String beanNamePattern; + private final boolean simulateDynamicTest; + + public FooPointcutExpression(String beanNamePattern, + boolean simulateDynamicTest) { + this.beanNamePattern = beanNamePattern; + this.simulateDynamicTest = simulateDynamicTest; + } + + public boolean couldMatchJoinPointsInType(Class aClass) { + System.out.println("wubble?"); + return true; + } + + public boolean couldMatchJoinPointsInType(Class aClass, + MatchingContext context) { + System.out.println("wibble?"); + if (this.beanNamePattern.equals(context.getBinding("beanName"))) { + return true; + } else { + return false; + } + } + + public boolean mayNeedDynamicTest() { + return this.simulateDynamicTest; + } + + public FuzzyBoolean matchesStatically(MatchingContext matchContext) { + System.out.println("wobble?"); + if (this.simulateDynamicTest) + return FuzzyBoolean.MAYBE; + if (this.beanNamePattern + .equals(matchContext.getBinding("beanName"))) { + return FuzzyBoolean.YES; + } else { + return FuzzyBoolean.NO; + } + } + + public boolean matchesDynamically(MatchingContext matchContext) { + System.out.println("wabble?"); + return this.beanNamePattern.equals(matchContext + .getBinding("beanName")); + } + } + + public void testLambdaBeans() throws Exception { + runTest("lambda beans"); + + // Load the 1.8 compiled code + URLClassLoader ucl = new URLClassLoader(new URL[] {ajc.getSandboxDirectory().toURI().toURL()},this.getClass().getClassLoader()); + Class applicationClass = Class.forName("Application",false,ucl); + assertNotNull(applicationClass); + Object instance = applicationClass.newInstance(); + Method works = applicationClass.getDeclaredMethod("fromInnerClass"); + works.setAccessible(true); + Runnable r = (Runnable) works.invoke(instance); + // r.getClass().getName() == Application$1 + + Method fails = applicationClass.getDeclaredMethod("fromLambdaExpression"); + fails.setAccessible(true); + Runnable r2 = (Runnable) fails.invoke(instance); + // r2.getClass().getName() == Application$$Lambda$1/1652149987 + +// JavaClass jc = getClassFrom(ajc.getSandboxDirectory(), "Application"); + PointcutParser parser = PointcutParser + .getPointcutParserSupportingAllPrimitivesAndUsingSpecifiedClassloaderForResolution(ucl); + FooDesignatorHandler beanHandler = new FooDesignatorHandler(); + parser.registerPointcutDesignatorHandler(beanHandler); + PointcutExpression pc = parser.parsePointcutExpression("foo(myBean)"); + DefaultMatchingContext context = new DefaultMatchingContext(); + pc.setMatchingContext(context); + + context.addContextBinding("beanName", "myBean"); + assertTrue(pc.couldMatchJoinPointsInType(r.getClass())); + + context.addContextBinding("beanName", "yourBean"); + assertFalse(pc.couldMatchJoinPointsInType(r.getClass())); + + context.addContextBinding("beanName", "myBean"); + assertTrue(pc.couldMatchJoinPointsInType(r2.getClass())); + + context.addContextBinding("beanName", "yourBean"); + assertFalse(pc.couldMatchJoinPointsInType(r2.getClass())); + } + + public void testMissingExtends() throws Exception { runTest("missing extends on generic target"); } - + public void testMissingMethod_462821() throws Exception { runTest("missing method"); } @@ -37,7 +156,7 @@ public class Ajc186Tests extends org.aspectj.testing.XMLBasedAjcTestCase { @Override protected File getSpecFile() { - return getClassResource("ajc186.xml"); + return getClassResource("ajc186.xml"); } } diff --git a/tests/src/org/aspectj/systemtest/ajc186/ajc186.xml b/tests/src/org/aspectj/systemtest/ajc186/ajc186.xml index 69d0e0c05..4f1394a95 100644 --- a/tests/src/org/aspectj/systemtest/ajc186/ajc186.xml +++ b/tests/src/org/aspectj/systemtest/ajc186/ajc186.xml @@ -2,6 +2,11 @@ + + + + + -- 2.39.5