下面列出了怎么用org.objectweb.asm.commons.AdviceAdapter的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public MethodVisitor visitMethod(int access, final String name, final String desc, String signature, String[] exceptions) {
MethodVisitor methodVisitor = cv.visitMethod(access, name, desc, signature, exceptions);
return new AdviceAdapter(ASM5, methodVisitor, access, name, desc) {
@Override
protected void onMethodEnter() {
super.onMethodEnter();
if (name.equals(globalInfo.getRouterConfig().getRouterInitMethod())) {
for (String clazz : globalInfo.getRouterComponents()) {
mv.visitMethodInsn(Opcodes.INVOKESTATIC,
clazz,
globalInfo.getRouterConfig().getRouterInitMethod(),
globalInfo.getRouterConfig().getRouterInitMethodDescriptor(),
false);
}
}
}
};
}
/**
* 用ASM构建代码锁
*
* @param aa ASM
* @param beginCodeArray 代码块开始特征数组
* 字节码流要求不能破坏执行堆栈
* @param endCodeArray 代码块结束特征数组
* 字节码流要求不能破坏执行堆栈
*/
public AsmCodeLock(AdviceAdapter aa, int[] beginCodeArray, int[] endCodeArray) {
if (null == beginCodeArray
|| null == endCodeArray
|| beginCodeArray.length != endCodeArray.length) {
throw new IllegalArgumentException();
}
this.aa = aa;
this.beginCodeArray = beginCodeArray;
this.endCodeArray = endCodeArray;
}
CallAsmCodeLock(AdviceAdapter aa) {
super(
aa,
new int[]{
ICONST_2, POP
},
new int[]{
ICONST_3, POP
}
);
}