本文整理汇总了Java中java.lang.invoke.MethodType.insertParameterTypes方法的典型用法代码示例。如果您正苦于以下问题:Java MethodType.insertParameterTypes方法的具体用法?Java MethodType.insertParameterTypes怎么用?Java MethodType.insertParameterTypes使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类java.lang.invoke.MethodType
的用法示例。
在下文中一共展示了MethodType.insertParameterTypes方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。
示例1: testCountedLoopVoidInit
import java.lang.invoke.MethodType; //导入方法依赖的package包/类
@Test
public static void testCountedLoopVoidInit() throws Throwable {
MethodHandle fit5 = MethodHandles.constant(int.class, 5);
for (int i = 0; i < 8; i++) {
MethodHandle zero = MethodHandles.zero(void.class);
MethodHandle init = fit5;
MethodHandle body = Counted.MH_printHello;
boolean useNull = (i & 1) != 0, addInitArg = (i & 2) != 0, addBodyArg = (i & 4) != 0;
if (useNull) zero = null;
if (addInitArg) init = MethodHandles.dropArguments(init, 0, int.class);
if (addBodyArg) body = MethodHandles.dropArguments(body, 1, int.class);
System.out.println("testCountedLoopVoidInit i="+i+" : "+Arrays.asList(init, zero, body));
MethodHandle loop = MethodHandles.countedLoop(init, zero, body);
MethodType expectedType = Counted.MT_countedPrinting;
if (addInitArg || addBodyArg)
expectedType = expectedType.insertParameterTypes(0, int.class);
assertEquals(expectedType, loop.type());
if (addInitArg || addBodyArg)
loop.invoke(99);
else
loop.invoke();
}
}
示例2: getMethodType
import java.lang.invoke.MethodType; //导入方法依赖的package包/类
private static MethodType getMethodType(final AccessibleObject ao) {
final boolean isMethod = ao instanceof Method;
final Class<?> rtype = isMethod ? ((Method)ao).getReturnType() : ((Constructor<?>)ao).getDeclaringClass();
final Class<?>[] ptypes = isMethod ? ((Method)ao).getParameterTypes() : ((Constructor<?>)ao).getParameterTypes();
final MethodType type = MethodType.methodType(rtype, ptypes);
final Member m = (Member)ao;
return type.insertParameterTypes(0,
isMethod ?
Modifier.isStatic(m.getModifiers()) ?
Object.class :
m.getDeclaringClass() :
StaticClass.class);
}
示例3: testCountedLoopBodyParameters
import java.lang.invoke.MethodType; //导入方法依赖的package包/类
@Test(dataProvider = "countedLoopBodyParameters")
public static void testCountedLoopBodyParameters(MethodType countType, MethodType initType, MethodType bodyType) throws Throwable {
MethodHandle loop = MethodHandles.countedLoop(
MethodHandles.empty(countType),
initType == null ? null : MethodHandles.empty(initType),
MethodHandles.empty(bodyType));
// The rule: If body takes the minimum number of parameters, then take what countType offers.
// The initType has to just roll with whatever the other two agree on.
int innerParams = (bodyType.returnType() == void.class ? 1 : 2);
MethodType expectType = bodyType.dropParameterTypes(0, innerParams);
if (expectType.parameterCount() == 0)
expectType = expectType.insertParameterTypes(0, countType.parameterList());
assertEquals(expectType, loop.type());
}
示例4: Binder
import java.lang.invoke.MethodType; //导入方法依赖的package包/类
Binder(final LinkerServices linkerServices, final MethodType methodType, final Object fixedKey) {
this.linkerServices = linkerServices;
this.methodType = fixedKey == null ? methodType : methodType.insertParameterTypes(1, fixedKey.getClass());
this.fixedKey = fixedKey;
}
示例5: getGuardedInvocation
import java.lang.invoke.MethodType; //导入方法依赖的package包/类
@Override
public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest, final LinkerServices linkerServices) throws Exception {
final Object objBoundCallable = linkRequest.getReceiver();
if(!(objBoundCallable instanceof BoundCallable)) {
return null;
}
final CallSiteDescriptor descriptor = linkRequest.getCallSiteDescriptor();
final Operation operation = NamedOperation.getBaseOperation(descriptor.getOperation());
// We need to distinguish NEW from CALL because CALL sites have parameter list of the form
// "callee, this, args", while NEW sites have "callee, args" -- they lack the "this" parameter.
final boolean isCall;
if (operation == StandardOperation.NEW) {
isCall = false;
} else if (operation == StandardOperation.CALL) {
isCall = true;
} else {
// Only CALL and NEW are supported.
return null;
}
final BoundCallable boundCallable = (BoundCallable)objBoundCallable;
final Object callable = boundCallable.getCallable();
final Object boundThis = boundCallable.getBoundThis();
// We need to ask the linker services for a delegate invocation on the target callable.
// Replace arguments (boundCallable[, this], args) => (callable[, boundThis], boundArgs, args) when delegating
final Object[] args = linkRequest.getArguments();
final Object[] boundArgs = boundCallable.getBoundArgs();
final int argsLen = args.length;
final int boundArgsLen = boundArgs.length;
final Object[] newArgs = new Object[argsLen + boundArgsLen];
newArgs[0] = callable;
final int firstArgIndex;
if (isCall) {
newArgs[1] = boundThis;
firstArgIndex = 2;
} else {
firstArgIndex = 1;
}
System.arraycopy(boundArgs, 0, newArgs, firstArgIndex, boundArgsLen);
System.arraycopy(args, firstArgIndex, newArgs, firstArgIndex + boundArgsLen, argsLen - firstArgIndex);
// Use R(T0, T1, T2, ...) => R(callable.class, boundThis.class, boundArg0.class, ..., boundArgn.class, T2, ...)
// call site type when delegating to underlying linker (for NEW, there's no this).
final MethodType type = descriptor.getMethodType();
// Use R(T0, ...) => R(callable.class, ...)
MethodType newMethodType = descriptor.getMethodType().changeParameterType(0, callable.getClass());
if (isCall) {
// R(callable.class, T1, ...) => R(callable.class, boundThis.class, ...)
newMethodType = newMethodType.changeParameterType(1, boundThis == null? Object.class : boundThis.getClass());
}
// R(callable.class[, boundThis.class], T2, ...) => R(callable.class[, boundThis.class], boundArg0.class, ..., boundArgn.class, T2, ...)
for(int i = boundArgs.length; i-- > 0;) {
newMethodType = newMethodType.insertParameterTypes(firstArgIndex, boundArgs[i] == null ? Object.class : boundArgs[i].getClass());
}
final CallSiteDescriptor newDescriptor = descriptor.changeMethodType(newMethodType);
// Delegate to target's linker
final GuardedInvocation inv = linkerServices.getGuardedInvocation(linkRequest.replaceArguments(newDescriptor, newArgs));
if(inv == null) {
return null;
}
// Bind (callable[, boundThis], boundArgs) to the delegate handle
final MethodHandle boundHandle = MethodHandles.insertArguments(inv.getInvocation(), 0,
Arrays.copyOf(newArgs, firstArgIndex + boundArgs.length));
final Class<?> p0Type = type.parameterType(0);
final MethodHandle droppingHandle;
if (isCall) {
// Ignore incoming boundCallable and this
droppingHandle = MethodHandles.dropArguments(boundHandle, 0, p0Type, type.parameterType(1));
} else {
// Ignore incoming boundCallable
droppingHandle = MethodHandles.dropArguments(boundHandle, 0, p0Type);
}
// Identity guard on boundCallable object
final MethodHandle newGuard = Guards.getIdentityGuard(boundCallable);
return inv.replaceMethods(droppingHandle, newGuard.asType(newGuard.type().changeParameterType(0, p0Type)));
}