diff --git a/springloaded/src/main/java/org/springsource/loaded/support/Java8.java b/springloaded/src/main/java/org/springsource/loaded/support/Java8.java index 7218e13..25f2432 100644 --- a/springloaded/src/main/java/org/springsource/loaded/support/Java8.java +++ b/springloaded/src/main/java/org/springsource/loaded/support/Java8.java @@ -150,8 +150,8 @@ public class Java8 { if (null == ownerRType || !ownerRType.hasBeenReloaded()) { // target containing the reference/lambdaMethod has not been reloaded, no need to get over // complicated. - Class ownerClazz = ownerRType.getClazz(); - implMethod = caller.findVirtual(ownerClazz, name, implMethodType); + Class clazz = callerLoader.loadClass(owner.replace("/", ".")); + implMethod = caller.findVirtual(clazz, name, implMethodType); } else { MethodMember targetReferenceMethodMember = ownerRType.getCurrentMethod(name, descriptor); diff --git a/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java b/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java index 665880e..8c7779e 100644 --- a/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java +++ b/springloaded/src/test/java/org/springsource/loaded/test/Java8Tests.java @@ -68,6 +68,26 @@ public class Java8Tests extends SpringLoadedTests { // TODO should assert something but the issue is that the JVM crashes... } + @Test + public void issue173() throws Exception { + String t = "bugs.Issue173"; + TypeRegistry typeRegistry = getTypeRegistry(t); + byte[] sc = loadBytesForClass(t); + ReloadableType rtype = typeRegistry.addType(t, sc); + + Class clazz = rtype.getClazz(); + @SuppressWarnings("unused") + Result r = runUnguarded(clazz, "run"); + + r = runUnguarded(clazz, "run"); + + rtype.loadNewVersion("002", rtype.bytesInitial); + + r = runUnguarded(clazz, "run"); + + assertEquals("https://www.redacted.com/path", r.returnValue); + } + @Test public void callBasicType() throws Exception { String t = "basic.FirstClass"; diff --git a/testdata-java8/src/main/java/bugs/Issue173.java b/testdata-java8/src/main/java/bugs/Issue173.java new file mode 100644 index 0000000..324ac9f --- /dev/null +++ b/testdata-java8/src/main/java/bugs/Issue173.java @@ -0,0 +1,49 @@ +package bugs; + +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class Issue173 { + public static void main(String[] args) { + System.out.println(run()); + } + + public static String run() { + return url("path").toString(); + } + + public static URI url(Object... args) { + try { + /* flattening the paths */ + final List paths = Arrays + .stream(args) + .flatMap(arg -> { + if (arg instanceof Collection) { + return ((Collection) arg).stream(); + } else if (arg instanceof Object[]) { + return Arrays.stream((Object[]) arg); + } + + return Arrays.stream(new Object[]{ + arg + }); + }) + .map(Object::toString) + .map(String::toLowerCase) + .collect(Collectors.toList()); + + Path path = Paths.get("/", paths.toArray(new String[0])); + URI uri = new URI("https", "www.redacted.com", path.toString(), null); + + return uri; + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } +}