--- old/src/java.base/share/classes/java/lang/invoke/MemberName.java 2019-04-24 13:36:52.000000000 -0700 +++ new/src/java.base/share/classes/java/lang/invoke/MemberName.java 2019-04-24 13:36:51.000000000 -0700 @@ -685,8 +685,14 @@ MethodHandleNatives.init(this, ctor); assert(isResolved() && this.clazz != null); this.name = CONSTRUCTOR_NAME; - if (this.type == null) - this.type = new Object[] { void.class, ctor.getParameterTypes() }; + if (this.type == null) { + Class rtype = void.class; + if (isStatic()) { // a static init factory, not a true constructor + rtype = getDeclaringClass(); + // FIXME: If it's a hidden class, this sig won't work. + } + this.type = new Object[] { rtype, ctor.getParameterTypes() }; + } } /** Create a name for the given reflected field. The resulting name will be in a resolved state. */ @@ -827,7 +833,7 @@ * The resulting name will in an unresolved state. */ public MemberName(Class defClass, String name, MethodType type, byte refKind) { - int initFlags = (name != null && name.equals(CONSTRUCTOR_NAME) ? IS_CONSTRUCTOR : IS_METHOD); + int initFlags = (name != null && name.equals(CONSTRUCTOR_NAME) && type.returnType() == void.class ? IS_CONSTRUCTOR : IS_METHOD); init(defClass, name, type, flagsMods(initFlags, 0, refKind)); initResolved(false); }