示例#1
0
    // called from Lookup.revealDirect() (instead of MethodHandle.internalMemberName()) via map.xml replace-method-call
    public static MemberName internalMemberName(MethodHandle mh)
    {
#if FIRST_PASS
        return(null);
#else
        MemberName mn = mh.internalMemberName();
        if (mn.isStatic() && mn.getName() == "<init>")
        {
            // HACK since we convert String constructors into static methods, we have to undo that here
            // Note that the MemberName we return is only used for a security check and by InfoFromMemberName (a MethodHandleInfo implementation),
            // so we don't need to make it actually invokable.
            MemberName alt = new MemberName();
            typeof(MemberName).GetField("clazz", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(alt, mn.getDeclaringClass());
            typeof(MemberName).GetField("name", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(alt, mn.getName());
            typeof(MemberName).GetField("type", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(alt, mn.getMethodType().changeReturnType(typeof(void)));
            int flags = mn._flags();
            flags -= MethodHandleNatives.Constants.MN_IS_METHOD;
            flags += MethodHandleNatives.Constants.MN_IS_CONSTRUCTOR;
            flags &= ~(MethodHandleNatives.Constants.MN_REFERENCE_KIND_MASK << MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT);
            flags |= MethodHandleNatives.Constants.REF_newInvokeSpecial << MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
            flags &= ~MethodHandleNatives.Constants.ACC_STATIC;
            alt._flags(flags);
            return(alt);
        }
        return(mn);
#endif
    }