本文整理汇总了Java中jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESTATIC属性的典型用法代码示例。如果您正苦于以下问题:Java Opcodes.H_INVOKESTATIC属性的具体用法?Java Opcodes.H_INVOKESTATIC怎么用?Java Opcodes.H_INVOKESTATIC使用的例子?那么, 这里精选的属性代码示例或许可以为您提供帮助。您也可以进一步了解该属性所在类jdk.internal.org.objectweb.asm.Opcodes
的用法示例。
在下文中一共展示了Opcodes.H_INVOKESTATIC属性的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。
示例1: visitInvokeDynamicInsn
@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm,
Object... bsmArgs) {
checkStartCode();
checkEndCode();
checkMethodIdentifier(version, name, "name");
checkMethodDesc(desc);
if (bsm.getTag() != Opcodes.H_INVOKESTATIC
&& bsm.getTag() != Opcodes.H_NEWINVOKESPECIAL) {
throw new IllegalArgumentException("invalid handle tag "
+ bsm.getTag());
}
for (int i = 0; i < bsmArgs.length; i++) {
checkLDCConstant(bsmArgs[i]);
}
super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
++insnCount;
}
示例2: appendHandle
/**
* Appends the information about the given handle to {@link #buf buf}.
*
* @param h
* a handle, non null.
*/
protected void appendHandle(final Handle h) {
int tag = h.getTag();
buf.append("// handle kind 0x").append(Integer.toHexString(tag))
.append(" : ");
boolean isMethodHandle = false;
switch (tag) {
case Opcodes.H_GETFIELD:
buf.append("GETFIELD");
break;
case Opcodes.H_GETSTATIC:
buf.append("GETSTATIC");
break;
case Opcodes.H_PUTFIELD:
buf.append("PUTFIELD");
break;
case Opcodes.H_PUTSTATIC:
buf.append("PUTSTATIC");
break;
case Opcodes.H_INVOKEINTERFACE:
buf.append("INVOKEINTERFACE");
isMethodHandle = true;
break;
case Opcodes.H_INVOKESPECIAL:
buf.append("INVOKESPECIAL");
isMethodHandle = true;
break;
case Opcodes.H_INVOKESTATIC:
buf.append("INVOKESTATIC");
isMethodHandle = true;
break;
case Opcodes.H_INVOKEVIRTUAL:
buf.append("INVOKEVIRTUAL");
isMethodHandle = true;
break;
case Opcodes.H_NEWINVOKESPECIAL:
buf.append("NEWINVOKESPECIAL");
isMethodHandle = true;
break;
}
buf.append('\n');
buf.append(tab3);
appendDescriptor(INTERNAL_NAME, h.getOwner());
buf.append('.');
buf.append(h.getName());
if(!isMethodHandle){
buf.append('(');
}
appendDescriptor(HANDLE_DESCRIPTOR, h.getDesc());
if(!isMethodHandle){
buf.append(')');
}
}
示例3: visitMethod
@Override
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature,
final String[] exceptions) {
/* a code generate looks like
* 0: aload_0
* 1: ldc #125 // int 1
* 3: ldc2_w #126 // long 2l
* 6: ldc #128 // float 3.0f
* 8: ldc2_w #129 // double 4.0d
* 11: ldc #132 // String 5
* 13: aload_0
* 14: getfield #135 // Field nativeCallee:Z
* 17: ifeq 28
* 20: invokedynamic #181, 0 // InvokeDynamic #1:calleeNative:(Lcompiler/calls/common/InvokeDynamic;IJFDLjava/lang/String;)Z
* 25: goto 33
* 28: invokedynamic #183, 0 // InvokeDynamic #1:callee:(Lcompiler/calls/common/InvokeDynamic;IJFDLjava/lang/String;)Z
* 33: ldc #185 // String Call insuccessfull
* 35: invokestatic #191 // Method jdk/test/lib/Asserts.assertTrue:(ZLjava/lang/String;)V
* 38: return
*
* or, using java-like pseudo-code
* if (this.nativeCallee == false) {
* invokedynamic-call-return-value = invokedynamic-of-callee
* } else {
* invokedynamic-call-return-value = invokedynamic-of-nativeCallee
* }
* Asserts.assertTrue(invokedynamic-call-return-value, error-message);
* return;
*/
if (name.equals(CALLER_METHOD_NAME)) {
MethodVisitor mv = cv.visitMethod(access, name, desc,
signature, exceptions);
Label nonNativeLabel = new Label();
Label checkLabel = new Label();
MethodType mtype = MethodType.methodType(CallSite.class,
MethodHandles.Lookup.class, String.class, MethodType.class);
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, CLASS,
BOOTSTRAP_METHOD_NAME, mtype.toMethodDescriptorString());
mv.visitCode();
// push callee parameters onto stack
mv.visitVarInsn(Opcodes.ALOAD, 0);//push "this"
mv.visitLdcInsn(1);
mv.visitLdcInsn(2L);
mv.visitLdcInsn(3.0f);
mv.visitLdcInsn(4.0d);
mv.visitLdcInsn("5");
// params loaded. let's decide what method to call
mv.visitVarInsn(Opcodes.ALOAD, 0); // push "this"
// get nativeCallee field
mv.visitFieldInsn(Opcodes.GETFIELD, CLASS, CALL_NATIVE_FIELD,
CALL_NATIVE_FIELD_DESC);
// if nativeCallee == false goto nonNativeLabel
mv.visitJumpInsn(Opcodes.IFEQ, nonNativeLabel);
// invokedynamic nativeCalleeMethod using bootstrap method
mv.visitInvokeDynamicInsn(NATIVE_CALLEE_METHOD_NAME,
CALLEE_METHOD_DESC, bootstrap);
// goto checkLabel
mv.visitJumpInsn(Opcodes.GOTO, checkLabel);
// label: nonNativeLabel
mv.visitLabel(nonNativeLabel);
// invokedynamic calleeMethod using bootstrap method
mv.visitInvokeDynamicInsn(CALLEE_METHOD_NAME, CALLEE_METHOD_DESC,
bootstrap);
mv.visitLabel(checkLabel);
mv.visitLdcInsn(CallsBase.CALL_ERR_MSG);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, ASSERTS_CLASS,
ASSERTTRUE_METHOD_NAME, ASSERTTRUE_METHOD_DESC, false);
// label: return
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
return null;
}
return super.visitMethod(access, name, desc, signature, exceptions);
}