aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Tan <samueltan@google.com>2016-02-24 15:54:57 -0800
committerSamuel Tan <samueltan@google.com>2016-02-24 15:56:33 -0800
commitab38abdf175554643d40b889d58d283d358218c3 (patch)
tree4bdaf2d8c99e2050addccd482bbdd2095731b635
parent8e77f1890450085d4aa635c86dfd91160572631e (diff)
downloaddexmaker-ab38abdf175554643d40b889d58d283d358218c3.tar.gz
Fix ProxyBuilder tries to extend final methods.
If an interface method is implemented by a final method in a parent class of the interface-implementng child, ProxyBuilder misses the final'ness of the implementation, and tries to override the method.V (cherry picked from commit 6ada76ae1356c9d05e6e4f4a4ae02c914e634534) BUG: 27342578 Change-Id: Ic7c05c90c98469114fff1fc3f0eab28aa43ebff4
-rw-r--r--src/main/java/com/google/dexmaker/stock/ProxyBuilder.java6
-rw-r--r--src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java14
2 files changed, 19 insertions, 1 deletions
diff --git a/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java b/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java
index f943840..aa59886 100644
--- a/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java
+++ b/src/main/java/com/google/dexmaker/stock/ProxyBuilder.java
@@ -634,7 +634,11 @@ public final class ProxyBuilder<T> {
// Skip final methods, we can't override them. We
// also need to remember them, in case the same
// method exists in a parent class.
- seenFinalMethods.add(new MethodSetEntry(method));
+ MethodSetEntry entry = new MethodSetEntry(method);
+ seenFinalMethods.add(entry);
+ // We may have seen this method already, from an interface
+ // implemented by a child class. We need to remove it here.
+ sink.remove(entry);
continue;
}
if ((method.getModifiers() & STATIC) != 0) {
diff --git a/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java b/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java
index e6912c4..763d740 100644
--- a/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java
+++ b/src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java
@@ -819,6 +819,20 @@ public class ProxyBuilderTest extends TestCase {
assertEquals("no proxy", proxyFor(FinalToString.class).build().toString());
}
+ public static class FinalInterfaceImpl implements FooReturnsString {
+ @Override public final String foo() {
+ return "no proxy";
+ }
+ }
+
+ public static class ExtenstionOfFinalInterfaceImpl extends FinalInterfaceImpl
+ implements FooReturnsString {
+ }
+
+ public void testFinalInterfaceImpl() throws Throwable {
+ assertEquals("no proxy", proxyFor(ExtenstionOfFinalInterfaceImpl.class).build().foo());
+ }
+
/** Simple helper to add the most common args for this test to the proxy builder. */
private <T> ProxyBuilder<T> proxyFor(Class<T> clazz) throws Exception {
return ProxyBuilder.forClass(clazz)