概述
@Override
public byte[] visit(Function node) {
FunctionInfo info = node.getValue();
boolean needInstance = !info.isStatic() && !info.isConstructor();
if (needInstance) {
node.getChild(0).accept(this); // placing instance on stack
}
// call itself with specific invoke*
String signature = info.argTypes.stream()
.skip(!needInstance ? 0 : 1)
.map(vi -> new String(vi.type.accept(this)))
.collect(Collectors.joining("", "(", ")"))
+ (info.isConstructor() ? "V" : new String(node.getResultType().accept(this)));
int invokeCode = Opcodes.INVOKEVIRTUAL;
if (info.isStatic()) {
invokeCode = Opcodes.INVOKESTATIC;
} else if (info.isConstructor() || info.isPrivate()) {
// TODO : superclass method invocation?
invokeCode = Opcodes.INVOKESPECIAL;
} else {
if (info.owner.isInterface()) {
invokeCode = Opcodes.INVOKEINTERFACE;
}
}
if (info.isConstructor()) {
currentMV.visitTypeInsn(Opcodes.NEW, asInternalName(info.owner.getName()));
currentMV.visitInsn(Opcodes.DUP);
}
// calculating parameters
node.getChildren().stream()
.skip(!needInstance ? 0 : 1)
.forEachOrdered(c -> c.accept(this));
currentMV.visitMethodInsn(invokeCode, asInternalName(info.owner.getName()),
info.isConstructor() ? "" : info.name, signature,
invokeCode == Opcodes.INVOKEINTERFACE);
return EMPTY_BYTE_ARRAY;
}
最后
以上就是呆萌钢笔为你收集整理的java invokevirtual_Java Opcodes.INVOKEVIRTUAL属性代码示例的全部内容,希望文章能够帮你解决java invokevirtual_Java Opcodes.INVOKEVIRTUAL属性代码示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复