--- old/src/java.base/share/classes/java/lang/reflect/Proxy.java 2016-04-12 19:01:56.000000000 -0700 +++ new/src/java.base/share/classes/java/lang/reflect/Proxy.java 2016-04-12 19:01:56.000000000 -0700 @@ -689,13 +689,14 @@ } /* - * Returns all types referenced by all public method signatures of + * Returns all types referenced by all public non-static method signatures of * the proxy interfaces */ private static Set> referencedTypes(ClassLoader loader, List> interfaces) { return interfaces.stream() .flatMap(intf -> Stream.of(intf.getMethods()) + .filter(m -> !Modifier.isStatic(m.getModifiers())) .flatMap(ProxyBuilder::methodRefTypes) .map(ProxyBuilder::getElementType) .filter(t -> !t.isPrimitive())) @@ -795,26 +796,13 @@ // map to dynamic proxy module and add reads edge and qualified exports, if necessary Module target = getDynamicModule(loader); - // set up proxy class access to proxy interfaces and superinterfaces - Deque> deque = new LinkedList<>(interfaces); - Set> visited = new HashSet<>(); - while (!deque.isEmpty()) { - Class c = deque.poll(); - if (!visited.add(c)) { - continue; - } + // set up proxy class access to proxy interfaces and types + // referenced in the method signature + Set> types = new HashSet<>(interfaces); + types.addAll(refTypes); + for (Class c : types) { ensureAccess(target, c); - - // add all superinterfaces - for (Class intf : c.getInterfaces()) { - deque.add(intf); - } } - - // set up proxy class access to types referenced in the method signature - refTypes.stream() - .filter(t -> !visited.contains(t)) - .forEach(t -> ensureAccess(target, t)); return target; }