Olá Pessoal,
Já postei essa mensagem no forum do ASM mas não obtive resposta (aparentemente o problema não é tão trivial).
Basicamente preciso injentar (via manipulação de bytecode) uma chamada a um tratador de exceção específico em cada catch de cada método da minha classe. O tratador de exceções possui a assinatura descrita abaixo, sendo que a quantidade de parâmetros varia de acordo com o método tratado:
Throwable org.codecompany.jeha.core.handle(Throwable throwable, Object... methodParams)
Após manipulação do bytecode, o método deveria ter a estrutura exibida abaixo. Perceba que os parâmetros do método são passados ao tratador através de vargs.
[code]public void test(int x, Object y) {
try {
int y = 10 / 0;
}
catch (ArithmeticException e) {
// essa chamada deve ser inserida na primeira linha de cada catch:
// org.codecompany.jeha.core.HandlerUtil.handle(e, x, y);
// algum tratamento existente
}
catch (Exception e) {
// essa chamada deve ser inserida na primeira linha de cada catch:
// org.codecompany.jeha.core.HandlerUtil.handle(e, x, y);
// algum tratamento existente
}
}[/code]
O rascunho da classe que implementa a manipulação é exibida abaixo. Estou empacado.
package org.codecompany.jeha.asm;
import java.util.Iterator;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TryCatchBlockNode;
import org.objectweb.asm.tree.TypeInsnNode;
import org.objectweb.asm.tree.VarInsnNode;
public class Tree extends ClassAdapter implements Opcodes {
private ClassVisitor next;
public Tree(ClassVisitor cv) {
super(new ClassNode());
next = cv;
}
@Override
public void visitEnd() {
ClassNode cn = (ClassNode) cv;
transform(cn);
cn.accept(next);
}
@SuppressWarnings("unchecked")
public void transform(ClassNode cn) {
Iterator methods = cn.methods.iterator();
while (methods.hasNext()) {
MethodNode mn = (MethodNode) methods.next();
Iterator blocks = mn.tryCatchBlocks.iterator();
// 1. identifica os parametros do metodo (methodParam1, methodParam2, etc.)
// para cada bloco catch...
while (blocks.hasNext()) {
TryCatchBlockNode block = (TryCatchBlockNode) blocks.next();
LabelNode handler = block.handler;
InsnList il = mn.instructions;
// 2. identifica o parametro da excecao
// 3. chama org.codecompany.jeha.core.handle(exceptionParam, methodParam1, methodParam2, etc.)
}
}
}
}
Alguém se habilita?
Obrigado,