diff --git a/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java b/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java index 5b22e706508a..92d98a708036 100644 --- a/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java +++ b/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java @@ -26,6 +26,7 @@ import org.objectweb.asm.Type; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.*; /** @@ -61,6 +62,7 @@ import java.util.*; * java.lang.reflect.Proxy, see the {@link Proxy} class. */ +@SuppressWarnings("StaticFieldReferencedViaSubclass") public class AdvancedEnhancer extends AbstractClassGenerator { private static final CallbackFilter ALL_ZERO = new CallbackFilter(){ @@ -520,6 +522,9 @@ public class AdvancedEnhancer extends AbstractClassGenerator } final Map methodInfoMap = new HashMap(); for (Method method : actualMethods) { + if (isJdk8DefaultMethod(method)) { + continue; + } int modifiers = Constants.ACC_FINAL | (method.getModifiers() & ~Constants.ACC_ABSTRACT & ~Constants.ACC_NATIVE & ~Constants.ACC_SYNCHRONIZED); if (forcePublic.contains(MethodWrapper.create(method))) { @@ -551,6 +556,11 @@ public class AdvancedEnhancer extends AbstractClassGenerator e.end_class(); } + private static boolean isJdk8DefaultMethod(Method method) { + return ((method.getModifiers() & (Modifier.ABSTRACT | Modifier.PUBLIC | Modifier.STATIC)) == + Modifier.PUBLIC) && method.getDeclaringClass().isInterface(); + } + private static void removeAllCovariantMethods(final List actualMethods, final Method method, final Map covariantMethods) { if ((method.getModifiers() & Constants.ACC_SYNTHETIC) != 0) { return; diff --git a/xml/dom-tests/tests/com/intellij/util/xml/ProxyTest.java b/xml/dom-tests/tests/com/intellij/util/xml/ProxyTest.java index 3db1009c15de..c44d9e74eb45 100644 --- a/xml/dom-tests/tests/com/intellij/util/xml/ProxyTest.java +++ b/xml/dom-tests/tests/com/intellij/util/xml/ProxyTest.java @@ -107,6 +107,8 @@ public class ProxyTest extends TestCase { public abstract String getBar(); + @Override + public abstract String foo(); } public void testAddInterfaces() throws Throwable {