日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java如何返回之前代码_java – 如何在每次返回之前向消息添加代码?

發布時間:2024/9/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java如何返回之前代码_java – 如何在每次返回之前向消息添加代码? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

你有兩個解決方案:

1.在MethodVisitor中使用visitInsn(int opcode)方法:

//this is the custom method visitor

private class InsertInitCodeBeforeReturnMethodVisitor extends MethodVisitor{

public InsertInitCodeBeforeReturnMethodVisitor(MethodVisitor mv) {

super(Opcodes.ASM4, mv);

}

@Override

public void visitInsn(int opcode) {

//whenever we find a RETURN, we instert the code, here only crazy example code

switch(opcode) {

case Opcodes.IRETURN:

case Opcodes.FRETURN:

case Opcodes.ARETURN:

case Opcodes.LRETURN:

case Opcodes.DRETURN:

case Opcodes.RETURN:

mv.visitVarInsn(Opcodes.ALOAD, 42);

break;

default: // do nothing

}

super.visitInsn(opcode);

}

}

//this is the custom method visitor

private class InsertInitCodeBeforeReturnMethodVisitor extends AdviceAdapter{

public InsertInitCodeBeforeReturnMethodVisitor(MethodVisitor mv, int access, String name, String desc) {

super(Opcodes.ASM4, mv, access, name, desc);

}

@Override

protected void onMethodExit(int opcode) {

if(opcode != Opcdoes.ATHROW) {

mv.visitVarInsn(Opcodes.ALOAD, 42);

}

}

}

我個人更喜歡AdviceAdapter,因為它消除了對原始返回指令進行實際調用的麻煩,就像你必須使用第一個解決方案一樣(例如super.visitInsn(操作碼);).其次,它為訪問RETURN指令(和ATHORW)提供了一個很好的抽象;這與vanilla MethodVisitor中的visitInsn(int操作碼)方法不同,在那里你必須檢測RETURN指令在諸如DUP,ICONST_0等許多其他方面的訪問,這些訪問可能與也可能與此問題無關.手.

但這又取決于手頭的問題.如果這是唯一正在執行的儀器,我將堅持使用AdviceAdapter.如果你想要結合訪問RETURN指令做其他事情,我可能會繼續使用簡單的MethodVisitor,因為它可能會給我更大的靈活性.話雖這么說,我一直在使用AdviceAdapter一年多的時間用于重型儀表驅動的項目,到目前為止它已經很好了!

編輯:

應用方法訪問者

通常不清楚如何使用或應用方法訪問者/方法適配器(至少對我而言),所以我在這里匯總了一個快速代碼示例:gist.github.com/VijayKrishna/1ca807c952187a7d8c4d,它顯示了如何使用方法適配器,通過它對應的class-visitor / class-adapter.在示例代碼段中,我已經從我在此答案中使用的方法更改了方法適配器的名稱,但它們執行相同的操作.此外,代碼段顯示了一個擴展AdviceAdapter的方法適配器.

總之,您首先“調用”類適配器,如下所示:

ClassReader cr = new ClassReader(in);

ClassWriter cw = new ClassWriter(ClassReader.EXPAND_FRAMES);

ReturnAdapter returnAdapter = new ReturnAdapter(cw, className);

cr.accept(returnAdapter, 0);

然后,您可以在類適配器的visitMethod方法中按照以下方法調整方法:

MethodVisitor mv;

mv = cv.visitMethod(access, name, desc, signature, exceptions);

mv = new MethodReturnAdapter(Opcodes.ASM4, className, access, name, desc, mv);

return mv;

總結

以上是生活随笔為你收集整理的java如何返回之前代码_java – 如何在每次返回之前向消息添加代码?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。