diff options
author | Samuel Tan <samueltan@google.com> | 2016-02-24 15:54:57 -0800 |
---|---|---|
committer | Samuel Tan <samueltan@google.com> | 2016-02-24 15:56:33 -0800 |
commit | ab38abdf175554643d40b889d58d283d358218c3 (patch) | |
tree | 4bdaf2d8c99e2050addccd482bbdd2095731b635 | |
parent | 8e77f1890450085d4aa635c86dfd91160572631e (diff) | |
download | dexmaker-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.java | 6 | ||||
-rw-r--r-- | src/test/java/com/google/dexmaker/stock/ProxyBuilderTest.java | 14 |
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) |