gpt4 book ai didi

java - 如何使用 Javassist 获取异常消息并将其记录在现有类的 catch block 上?

转载 作者:行者123 更新时间:2023-12-01 12:48:52 25 4
gpt4 key购买 nike

案例:

尝试插入带有字符串参数的日志方法,在本例中,在现有方法的任何 catch block 上使用 e.getMessage()

以下代码片段可以注入(inject)字符串。

...
CtMethod log = CtNewMethod.make("public void log(String s){ " +
" System.out.println(\"Hello from injected log method \" + s); " +
"}",
ct);
ct.addMethod(log);

...
ControlFlow cf = new ControlFlow(m);
Block blocks[] = cf.basicBlocks();
for(Block block : blocks){
Catcher catchers[] = block.catchers();
ArrayList<Catcher> catchersList = new ArrayList<Catcher>(Arrays.asList(catchers));
Collections.reverse(catchersList);
for (Catcher catcher : catchersList){
Block catchBlock = catcher.block();
int pos = catchBlock.position();

CodeIterator itr = m.getMethodInfo().getCodeAttribute().iterator();

Bytecode code = new Bytecode(m.getMethodInfo().getConstPool(), 0, 0);

code.addAload(0);
code.addLdc("LogParameter");
code.addInvokevirtual(ct,"log",log.getMethodInfo().getDescriptor());
code.addGap(2);
int n = itr.insertAt(pos,code.get());

m.getMethodInfo().rebuildStackMapForME(cp);
}
}

问题

我不能做的就是获取 e.getMessage() 作为 log(String) 的输入参数。

也许有人可以指出我正确的方向。

最佳答案

当你进入catch block 时,你会发现异常位于堆栈上。因此,您可以按如下方式提取消息:

  • 复制堆栈最顶层的值(这是一个异常(exception)),这样您就可以调用该对象的方法,而无需删除该值以进行更深层次的指令。

  • 通过虚拟调用 getMessage 从异常对象中提取消息。

这样,异常消息就位于堆栈顶部。

关于java - 如何使用 Javassist 获取异常消息并将其记录在现有类的 catch block 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com