--- old/src/share/vm/oops/constMethod.cpp 2014-11-06 13:33:13.756743856 -0500 +++ new/src/share/vm/oops/constMethod.cpp 2014-11-06 13:33:13.688743344 -0500 @@ -116,7 +116,11 @@ if (sizes->generic_signature_index() != 0) { extra_bytes += sizeof(u2); } - if (sizes->method_parameters_length() > 0) { + // This has to be a less-than-or-equal check, because we might be + // storing information from a zero-length MethodParameters + // attribute. We have to store these, because in some cases, they + // cause the reflection API to throw a MalformedParametersException. + if (sizes->method_parameters_length() >= 0) { extra_bytes += sizeof(u2); extra_bytes += sizes->method_parameters_length() * sizeof(MethodParametersElement); } @@ -237,7 +241,7 @@ _flags |= _has_linenumber_table; if (sizes->generic_signature_index() != 0) _flags |= _has_generic_signature; - if (sizes->method_parameters_length() > 0) + if (sizes->method_parameters_length() >= 0) _flags |= _has_method_parameters; if (sizes->checked_exceptions_length() > 0) _flags |= _has_checked_exceptions; @@ -272,7 +276,7 @@ if (sizes->generic_signature_index() != 0) *(generic_signature_index_addr()) = sizes->generic_signature_index(); // New data should probably go here. - if (sizes->method_parameters_length() > 0) + if (sizes->method_parameters_length() >= 0) *(method_parameters_length_addr()) = sizes->method_parameters_length(); if (sizes->checked_exceptions_length() > 0) *(checked_exceptions_length_addr()) = sizes->checked_exceptions_length(); @@ -283,7 +287,7 @@ } int ConstMethod::method_parameters_length() const { - return has_method_parameters() ? *(method_parameters_length_addr()) : 0; + return has_method_parameters() ? *(method_parameters_length_addr()) : -1; } MethodParametersElement* ConstMethod::method_parameters_start() const {