1.1 --- a/src/share/vm/runtime/reflectionUtils.cpp Wed Oct 16 10:52:41 2013 +0200 1.2 +++ b/src/share/vm/runtime/reflectionUtils.cpp Tue Nov 05 17:38:04 2013 -0800 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -27,8 +27,11 @@ 1.11 #include "memory/universe.inline.hpp" 1.12 #include "runtime/reflectionUtils.hpp" 1.13 1.14 -KlassStream::KlassStream(instanceKlassHandle klass, bool local_only, bool classes_only) { 1.15 - _klass = klass; 1.16 +KlassStream::KlassStream(instanceKlassHandle klass, bool local_only, 1.17 + bool classes_only, bool walk_defaults) { 1.18 + _klass = _base_klass = klass; 1.19 + _base_class_search_defaults = false; 1.20 + _defaults_checked = false; 1.21 if (classes_only) { 1.22 _interfaces = Universe::the_empty_klass_array(); 1.23 } else { 1.24 @@ -37,6 +40,7 @@ 1.25 _interface_index = _interfaces->length(); 1.26 _local_only = local_only; 1.27 _classes_only = classes_only; 1.28 + _walk_defaults = walk_defaults; 1.29 } 1.30 1.31 bool KlassStream::eos() { 1.32 @@ -45,7 +49,13 @@ 1.33 if (!_klass->is_interface() && _klass->super() != NULL) { 1.34 // go up superclass chain (not for interfaces) 1.35 _klass = _klass->super(); 1.36 + // Next for method walks, walk default methods 1.37 + } else if (_walk_defaults && (_defaults_checked == false) && (_base_klass->default_methods() != NULL)) { 1.38 + _base_class_search_defaults = true; 1.39 + _klass = _base_klass; 1.40 + _defaults_checked = true; 1.41 } else { 1.42 + // Next walk transitive interfaces 1.43 if (_interface_index > 0) { 1.44 _klass = _interfaces->at(--_interface_index); 1.45 } else {