當前位置: 首頁>>代碼示例>>Java>>正文


Java MethodHandles.arrayElementSetter方法代碼示例

本文整理匯總了Java中java.lang.invoke.MethodHandles.arrayElementSetter方法的典型用法代碼示例。如果您正苦於以下問題:Java MethodHandles.arrayElementSetter方法的具體用法?Java MethodHandles.arrayElementSetter怎麽用?Java MethodHandles.arrayElementSetter使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在java.lang.invoke.MethodHandles的用法示例。


在下文中一共展示了MethodHandles.arrayElementSetter方法的3個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Java代碼示例。

示例1: lookupArrayStore

import java.lang.invoke.MethodHandles; //導入方法依賴的package包/類
/**
 * Returns a method handle to do an array store.
 * @param receiverClass Class of the array to store the value in
 * @return a MethodHandle that accepts the receiver as first argument, the index as second argument,
 *   and the value to set as 3rd argument. Return value is undefined and should be ignored.
 */
static MethodHandle lookupArrayStore(Class<?> receiverClass) {
    if (receiverClass.isArray()) {
        return MethodHandles.arrayElementSetter(receiverClass);
    } else if (Map.class.isAssignableFrom(receiverClass)) {
        // maps allow access like mymap[key]
        return MAP_PUT;
    } else if (List.class.isAssignableFrom(receiverClass)) {
        return LIST_SET;
    }
    throw new IllegalArgumentException("Attempting to address a non-array type " +
                                       "[" + receiverClass.getCanonicalName() + "] as an array.");
}
 
開發者ID:justor,項目名稱:elasticsearch_my,代碼行數:19,代碼來源:Def.java

示例2: arrayElementSetter

import java.lang.invoke.MethodHandles; //導入方法依賴的package包/類
@Override
public MethodHandle arrayElementSetter(final Class<?> type) {
    final MethodHandle mh = MethodHandles.arrayElementSetter(type);
    return debug(mh, "arrayElementSetter", type);
}
 
開發者ID:SunburstApps,項目名稱:OpenJSharp,代碼行數:6,代碼來源:MethodHandleFactory.java

示例3: getElementSetter

import java.lang.invoke.MethodHandles; //導入方法依賴的package包/類
private GuardedInvocationComponent getElementSetter(final CallSiteDescriptor callSiteDescriptor,
        final LinkerServices linkerServices, final List<String> operations) throws Exception {
    final MethodType callSiteType = callSiteDescriptor.getMethodType();
    final Class<?> declaredType = callSiteType.parameterType(0);

    final GuardedInvocationComponent gic;
    // If declared type of receiver at the call site is already an array, a list or map, bind without guard. Thing
    // is, it'd be quite stupid of a call site creator to go though invokedynamic when it knows in advance they're
    // dealing with an array, or a list or map, but hey...
    // Note that for arrays and lists, using LinkerServices.asType() will ensure that any language specific linkers
    // in use will get a chance to perform any (if there's any) implicit conversion to integer for the indices.
    final boolean isMap;
    if(declaredType.isArray()) {
        gic = new GuardedInvocationComponent(MethodHandles.arrayElementSetter(declaredType));
        isMap = false;
    } else if(List.class.isAssignableFrom(declaredType)) {
        gic = new GuardedInvocationComponent(SET_LIST_ELEMENT);
        isMap = false;
    } else if(Map.class.isAssignableFrom(declaredType)) {
        gic = new GuardedInvocationComponent(PUT_MAP_ELEMENT);
        isMap = true;
    } else if(clazz.isArray()) {
        gic = getClassGuardedInvocationComponent(MethodHandles.arrayElementSetter(clazz), callSiteType);
        isMap = false;
    } else if(List.class.isAssignableFrom(clazz)) {
        gic = new GuardedInvocationComponent(SET_LIST_ELEMENT, Guards.asType(LIST_GUARD, callSiteType), List.class,
                ValidationType.INSTANCE_OF);
        isMap = false;
    } else if(Map.class.isAssignableFrom(clazz)) {
        gic = new GuardedInvocationComponent(PUT_MAP_ELEMENT, Guards.asType(MAP_GUARD, callSiteType), Map.class,
                ValidationType.INSTANCE_OF);
        isMap = true;
    } else {
        // Can't set elements for objects that are neither arrays, nor list, nor maps.
        gic = null;
        isMap = false;
    }

    // In contrast to, say, getElementGetter, we only compute the nextComponent if the target object is not a map,
    // as maps will always succeed in setting the element and will never need to fall back to the next component
    // operation.
    final GuardedInvocationComponent nextComponent = isMap ? null : getGuardedInvocationComponent(
            callSiteDescriptor, linkerServices, operations);
    if(gic == null) {
        return nextComponent;
    }

    // We can have "dyn:setElem:foo", especially in composites, i.e. "dyn:setElem|setProp:foo"
    final String fixedKey = getFixedKey(callSiteDescriptor);
    // Convert the key to a number if we're working with a list or array
    final Object typedFixedKey;
    if(!isMap && fixedKey != null) {
        typedFixedKey = convertKeyToInteger(fixedKey, linkerServices);
        if(typedFixedKey == null) {
            // key is not numeric, it can never succeed
            return nextComponent;
        }
    } else {
        typedFixedKey = fixedKey;
    }

    final GuardedInvocation gi = gic.getGuardedInvocation();
    final Binder binder = new Binder(linkerServices, callSiteType, typedFixedKey);
    final MethodHandle invocation = gi.getInvocation();

    if(nextComponent == null) {
        return gic.replaceInvocation(binder.bind(invocation));
    }

    final MethodHandle checkGuard = convertArgToInt(invocation == SET_LIST_ELEMENT ? RANGE_CHECK_LIST :
        RANGE_CHECK_ARRAY, linkerServices, callSiteDescriptor);
    final MethodPair matchedInvocations = matchReturnTypes(binder.bind(invocation),
            nextComponent.getGuardedInvocation().getInvocation());
    return nextComponent.compose(matchedInvocations.guardWithTest(binder.bindTest(checkGuard)), gi.getGuard(),
            gic.getValidatorClass(), gic.getValidationType());
}
 
開發者ID:SunburstApps,項目名稱:OpenJSharp,代碼行數:77,代碼來源:BeanLinker.java


注:本文中的java.lang.invoke.MethodHandles.arrayElementSetter方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。