151 @Test 152 public void testVirtualMethod() { 153 ResolvedJavaType a = getType(A.class); 154 ResolvedJavaType b = getType(B.class); 155 ResolvedJavaType c = getType(C.class); 156 ResolvedJavaMethod v1a = getMethod(a, "v1"); 157 ResolvedJavaMethod v2a = getMethod(a, "v2"); 158 ResolvedJavaMethod v2b = getMethod(b, "v2"); 159 160 assertEquals(v1a, a.resolveMethod(v1a, c)); 161 assertEquals(v1a, b.resolveMethod(v1a, c)); 162 assertEquals(v1a, c.resolveMethod(v1a, c)); 163 assertEquals(v2a, a.resolveMethod(v2a, c)); 164 assertEquals(v2b, b.resolveMethod(v2a, c)); 165 assertEquals(v2b, b.resolveMethod(v2b, c)); 166 assertEquals(v2b, c.resolveMethod(v2a, c)); 167 assertEquals(v2b, c.resolveMethod(v2b, c)); 168 169 } 170 171 static ResolvedJavaMethod getMethod(ResolvedJavaType type, String methodName) { 172 for (ResolvedJavaMethod method : type.getDeclaredMethods()) { 173 if (method.getName().equals(methodName)) { 174 return method; 175 } 176 } 177 throw new IllegalArgumentException(); 178 } 179 180 protected ResolvedJavaType getType(Class<?> clazz) { 181 ResolvedJavaType type = metaAccess.lookupJavaType(clazz); 182 type.initialize(); 183 return type; 184 } 185 } | 151 @Test 152 public void testVirtualMethod() { 153 ResolvedJavaType a = getType(A.class); 154 ResolvedJavaType b = getType(B.class); 155 ResolvedJavaType c = getType(C.class); 156 ResolvedJavaMethod v1a = getMethod(a, "v1"); 157 ResolvedJavaMethod v2a = getMethod(a, "v2"); 158 ResolvedJavaMethod v2b = getMethod(b, "v2"); 159 160 assertEquals(v1a, a.resolveMethod(v1a, c)); 161 assertEquals(v1a, b.resolveMethod(v1a, c)); 162 assertEquals(v1a, c.resolveMethod(v1a, c)); 163 assertEquals(v2a, a.resolveMethod(v2a, c)); 164 assertEquals(v2b, b.resolveMethod(v2a, c)); 165 assertEquals(v2b, b.resolveMethod(v2b, c)); 166 assertEquals(v2b, c.resolveMethod(v2a, c)); 167 assertEquals(v2b, c.resolveMethod(v2b, c)); 168 169 } 170 171 static class ClassType { 172 } 173 174 interface InterfaceType { 175 } 176 177 @Test 178 public void testCloneAccessibility() { 179 /* 180 * The resolution machinery for clone on arrays has some hacks in that show up in odd places 181 * so make sure that resolveMethod works as expected. 182 */ 183 ResolvedJavaType interfaceType = getType(InterfaceType.class); 184 ResolvedJavaType classType = getType(ClassType.class); 185 ResolvedJavaType arrayType = getType(double[].class); 186 ResolvedJavaMethod cloneMethod = getMethod(getType(Object.class), "clone"); 187 assertEquals("Can't resolve clone for class", cloneMethod, arrayType.resolveMethod(cloneMethod, classType)); 188 assertEquals("Can't resolve clone for interface", cloneMethod, arrayType.resolveMethod(cloneMethod, interfaceType)); 189 } 190 191 static ResolvedJavaMethod getMethod(ResolvedJavaType type, String methodName) { 192 for (ResolvedJavaMethod method : type.getDeclaredMethods()) { 193 if (method.getName().equals(methodName)) { 194 return method; 195 } 196 } 197 throw new IllegalArgumentException(); 198 } 199 200 protected ResolvedJavaType getType(Class<?> clazz) { 201 ResolvedJavaType type = metaAccess.lookupJavaType(clazz); 202 type.initialize(); 203 return type; 204 } 205 } |