< prev index next >
src/java.base/share/classes/java/lang/invoke/MemberName.java
Print this page
rev 55090 : secret-sfac
@@ -683,12 +683,18 @@
Objects.requireNonNull(ctor);
// fill in vmtarget, vmindex while we have ctor in hand:
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.
*/
public MemberName(Field fld) {
this(fld, false);
@@ -825,11 +831,11 @@
* The declaring class may be supplied as null if this is to be a bare name and type.
* The last argument is optional, a boolean which requests REF_invokeSpecial.
* 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);
}
/** Create a method, constructor, or field name from the given components:
* Reference kind, declaring class, name, type.
< prev index next >