summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-11-23 16:30:16 +0000
committeraclement <aclement>2005-11-23 16:30:16 +0000
commit5cba2054c0bbfb4bdf2f00f044e841741055282c (patch)
treeb27497f6572f0c84572fd4d6f124d683ab523825
parenta4caeb95261431c81f7beb0cddbff3b0865e614d (diff)
downloadaspectj-5cba2054c0bbfb4bdf2f00f044e841741055282c.tar.gz
aspectj-5cba2054c0bbfb4bdf2f00f044e841741055282c.zip
some fixes for 117622
-rw-r--r--weaver/testsrc/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateTest.java52
-rw-r--r--weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java26
-rw-r--r--weaver5/java5-testsrc/org/aspectj/weaver/TestJava5ReflectionBasedReferenceTypeDelegate.java25
3 files changed, 84 insertions, 19 deletions
diff --git a/weaver/testsrc/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateTest.java b/weaver/testsrc/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateTest.java
index 739f7841a..03ed66dd9 100644
--- a/weaver/testsrc/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateTest.java
+++ b/weaver/testsrc/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegateTest.java
@@ -11,17 +11,20 @@
* ******************************************************************/
package org.aspectj.weaver.reflect;
+
+import junit.framework.TestCase;
+
import org.aspectj.weaver.ResolvedMember;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.UnresolvedType;
-import org.aspectj.weaver.World;
-
-import junit.framework.TestCase;
public class ReflectionBasedReferenceTypeDelegateTest extends TestCase {
- private World world;
+ protected ReflectionWorld world;
private ResolvedType objectType;
+ private ResolvedType classType;
+ private ResolvedType enumType;
+
public void testIsAspect() {
assertFalse(objectType.isAspect());
@@ -86,31 +89,50 @@ public class ReflectionBasedReferenceTypeDelegateTest extends TestCase {
}
public void testGetSuperclass() {
- assertNull(objectType.getSuperclass());
+ assertTrue("Superclass of object should be null, but it is: "+objectType.getSuperclass(),objectType.getSuperclass()==null);
assertEquals(objectType,world.resolve("java.lang.Class").getSuperclass());
ResolvedType d = world.resolve("reflect.tests.D");
assertEquals(world.resolve("reflect.tests.C"),d.getSuperclass());
}
+
+ protected int findMethod(String name, ResolvedMember[] methods) {
+ for (int i=0; i<methods.length; i++) {
+ if (name.equals(methods[i].getName())) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
public void testGetDeclaredMethods() {
ResolvedMember[] methods = objectType.getDeclaredMethods();
- assertEquals(13,methods.length);
+ assertEquals(Object.class.getDeclaredMethods().length + Object.class.getDeclaredConstructors().length, methods.length);
ResolvedType c = world.resolve("reflect.tests.C");
methods = c.getDeclaredMethods();
assertEquals(3,methods.length);
- assertEquals("foo",methods[0].getName());
- assertEquals(world.resolve("java.lang.String"),methods[0].getReturnType());
- assertEquals(1, methods[0].getParameterTypes().length);
- assertEquals(objectType,methods[0].getParameterTypes()[0]);
- assertEquals(1,methods[0].getExceptions().length);
- assertEquals(world.resolve("java.lang.Exception"),methods[0].getExceptions()[0]);
- assertEquals("bar",methods[1].getName());
- assertEquals("init",methods[2].getName());
+ int idx = findMethod("foo", methods);
+ assertTrue(idx > -1);
+
+ assertEquals(world.resolve("java.lang.String"),methods[idx].getReturnType());
+ assertEquals(1, methods[idx].getParameterTypes().length);
+ assertEquals(objectType,methods[idx].getParameterTypes()[0]);
+ assertEquals(1,methods[idx].getExceptions().length);
+ assertEquals(world.resolve("java.lang.Exception"),methods[idx].getExceptions()[0]);
+ int baridx = findMethod("bar", methods);
+ int initidx = findMethod("init", methods);
+ assertTrue(baridx > -1);
+ assertTrue(initidx > -1);
+ assertTrue(baridx != initidx && baridx != idx && idx <= 2 && initidx <= 2 && baridx <= 2);
ResolvedType d = world.resolve("reflect.tests.D");
methods = d.getDeclaredMethods();
assertEquals(2,methods.length);
+
+ classType = world.resolve("java.lang.Class");
+ methods = classType.getDeclaredMethods();
+ assertEquals(Class.class.getDeclaredMethods().length + Class.class.getDeclaredConstructors().length, methods.length);
}
public void testGetDeclaredFields() {
@@ -135,7 +157,7 @@ public class ReflectionBasedReferenceTypeDelegateTest extends TestCase {
interfaces = d.getDeclaredInterfaces();
assertEquals(1,interfaces.length);
assertEquals(world.resolve("java.io.Serializable"),interfaces[0]);
-}
+ }
public void testGetDeclaredPointcuts() {
ResolvedMember[] pointcuts = objectType.getDeclaredPointcuts();
diff --git a/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java b/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java
index c1f3c9fd4..47f4918cc 100644
--- a/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java
+++ b/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java
@@ -79,8 +79,9 @@ public class Java15ReflectionBasedReferenceTypeDelegate extends
public AnnotationX[] getAnnotations() {
// AMC - we seem not to need to implement this method...
- throw new UnsupportedOperationException("getAnnotations on Java15ReflectionBasedReferenceTypeDelegate is not implemented yet");
- //return super.getAnnotations();
+ //throw new UnsupportedOperationException("getAnnotations on Java15ReflectionBasedReferenceTypeDelegate is not implemented yet");
+ // FIXME is this the right implementation in the reflective case?
+ return super.getAnnotations();
}
public ResolvedType[] getAnnotationTypes() {
@@ -127,7 +128,7 @@ public class Java15ReflectionBasedReferenceTypeDelegate extends
}
public ResolvedType getSuperclass() {
- if (superclass == null)
+ if (superclass == null && getBaseClass()!=Object.class) // superclass of Object is null
superclass = fromType(this.getBaseClass().getGenericSuperclass());
return superclass;
}
@@ -267,7 +268,24 @@ public class Java15ReflectionBasedReferenceTypeDelegate extends
private ResolvedType fromType(Type aType) {
if (aType instanceof Class) {
- return getWorld().resolve(((Class)aType).getName());
+ Class clazz = (Class)aType;
+ String name = clazz.getName();
+ /**
+ * getName() can return:
+ *
+ * 1. If this class object represents a reference type that is not an array type
+ * then the binary name of the class is returned
+ * 2. If this class object represents a primitive type or void, then the
+ * name returned is a String equal to the Java language keyword corresponding to the primitive type or void.
+ * 3. If this class object represents a class of arrays, then the internal form
+ * of the name consists of the name of the element type preceded by one or more '[' characters representing the depth of the array nesting.
+ */
+ if (clazz.isArray()) {
+ UnresolvedType ut = UnresolvedType.forSignature(name);
+ return getWorld().resolve(ut);
+ } else {
+ return getWorld().resolve(name);
+ }
} else if (aType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) aType;
ResolvedType baseType = fromType(pt.getRawType());
diff --git a/weaver5/java5-testsrc/org/aspectj/weaver/TestJava5ReflectionBasedReferenceTypeDelegate.java b/weaver5/java5-testsrc/org/aspectj/weaver/TestJava5ReflectionBasedReferenceTypeDelegate.java
new file mode 100644
index 000000000..450d00c6d
--- /dev/null
+++ b/weaver5/java5-testsrc/org/aspectj/weaver/TestJava5ReflectionBasedReferenceTypeDelegate.java
@@ -0,0 +1,25 @@
+package org.aspectj.weaver;
+
+import org.aspectj.weaver.reflect.ReflectionBasedReferenceTypeDelegateTest;
+
+public class TestJava5ReflectionBasedReferenceTypeDelegate extends ReflectionBasedReferenceTypeDelegateTest {
+
+ public void testResolveGeneric() {
+ UnresolvedType collectionType = UnresolvedType.forName("java.util.Collection<E>");
+// ResolvedType rt= world.resolve(collectionType);
+// ResolvedMember[] methods = world.resolve(collectionType).getDeclaredMethods();
+// assertTrue(findMethod("toArray", methods) != -1);
+ }
+
+ public void testResolveClass() {
+ //stack overflow
+ world.resolve("java.lang.Class");
+ }
+
+ // just here to override the super one so it doesnt run in this case ;)
+ public void testGetDeclaredMethods() {
+
+ }
+
+
+}