Skip to content

Commit f969cc2

Browse files
committed
Always load java.* classes by delegating to the bootstrap class loader
Fixes #34 for real
1 parent 281ef93 commit f969cc2

File tree

9 files changed

+35
-30
lines changed

9 files changed

+35
-30
lines changed

.idea/libraries/Maven__net_orfjackal_retrolambda_java_lang_dummies_1.xml

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ Version History
147147

148148
- Backports static methods on interfaces
149149
([Issue #31](https://github.com/orfjackal/retrolambda/issues/31))
150+
- Fixed a crash when trying backport Android classes
151+
([Issue #34](https://github.com/orfjackal/retrolambda/issues/34))
150152

151153
### Retrolambda 1.6.1 (2014-08-25)
152154

end-to-end-tests/end-to-end-tests.iml

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<orderEntry type="library" name="Maven: com.google.guava:guava:11.0.2" level="project" />
1414
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
1515
<orderEntry type="library" scope="TEST" name="Maven: commons-lang:commons-lang:2.6" level="project" />
16+
<orderEntry type="library" name="Maven: net.orfjackal.retrolambda:java-lang-dummies:1" level="project" />
1617
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.11" level="project" />
1718
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
1819
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />

end-to-end-tests/pom.xml

+9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@
2828
<scope>test</scope>
2929
</dependency>
3030

31+
<!-- See net.orfjackal.retrolambda.test.ClasspathTest#ignores_classes_in_explicit_classpath_that_are_under_the_java_package -->
32+
<dependency>
33+
<groupId>net.orfjackal.retrolambda</groupId>
34+
<artifactId>java-lang-dummies</artifactId>
35+
<version>1</version>
36+
<scope>system</scope>
37+
<systemPath>${basedir}/src/test/lib/java-lang-dummies.jar</systemPath>
38+
</dependency>
39+
3140
</dependencies>
3241

3342
<build>

end-to-end-tests/src/test/java/java/lang/Math.java

-20
This file was deleted.

end-to-end-tests/src/test/java/net/orfjackal/retrolambda/test/ClasspathTest.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
import org.hamcrest.*;
88
import org.junit.Test;
99

10-
import java.util.Arrays;
10+
import java.io.IOException;
11+
import java.net.URL;
12+
import java.util.*;
1113

1214
import static org.hamcrest.MatcherAssert.assertThat;
13-
import static org.hamcrest.Matchers.is;
15+
import static org.hamcrest.Matchers.*;
1416
import static org.junit.Assert.assertNotNull;
1517

1618
public class ClasspathTest {
@@ -65,7 +67,11 @@ public void prefers_classes_in_explicit_classpath_over_classes_in_the_JRE() {
6567
* contains {@code java.*} classes.
6668
*/
6769
@Test
68-
public void ignores_classes_in_explicit_classpath_that_are_under_the_java_package() {
69-
assertNotNull(getClass().getResource("/java/lang/Math.class"));
70+
public void ignores_classes_in_explicit_classpath_that_are_under_the_java_package() throws IOException {
71+
// We have a JAR on the classpath that contains dummy version of java.lang.Object,
72+
// the same way as android.jar, which causes Retrolambda to try loading that class
73+
// because the classes to be backported extend it implicitly.
74+
List<URL> resources = Collections.list(getClass().getClassLoader().getResources("java/lang/Object.class"));
75+
assertThat(resources, (Matcher) hasItem(hasToString(containsString("java-lang-dummies.jar"))));
7076
}
7177
}
823 Bytes
Binary file not shown.

retrolambda/src/main/java/net/orfjackal/retrolambda/NonDelegatingClassLoader.java

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ public NonDelegatingClassLoader(URL[] urls) {
1414

1515
@Override
1616
public Class<?> loadClass(String name) throws ClassNotFoundException {
17+
if (name.startsWith("java.")) { // the java.* classes can only be loaded by the bootstrap class loader
18+
return super.loadClass(name);
19+
}
1720
Class<?> c = findLoadedClass(name);
1821
if (c != null) {
1922
return c;

retrolambda/src/main/java/net/orfjackal/retrolambda/interfaces/ClassHierarchyAnalyzer.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,7 @@ public class ClassHierarchyAnalyzer implements MethodRelocations {
2323

2424
public void analyze(byte[] bytecode) {
2525
ClassReader cr = new ClassReader(bytecode);
26-
String className = cr.getClassName();
27-
if (className.startsWith("java/")) {
28-
// the JVM disallows user classes in java.* packages, so don't even try backporting them
29-
return;
30-
}
31-
Type clazz = classNameToType(className);
26+
Type clazz = classNameToType(cr.getClassName());
3227

3328
if (Flags.hasFlag(cr.getAccess(), ACC_INTERFACE)) {
3429
interfaces.add(cr);

0 commit comments

Comments
 (0)