IncompatibleClassChangeError
"Matthieu Lambert" <[email protected]> Tue, 4 Sep 2007 14:22:39 +0200
| Newsgroups | gmane.comp.jakarta.bcel.user |
|---|---|
| Message-ID | <006401c7eeee$491e0600$611410ac@nsis13> |
I am using BCEL since one week, and I have a problems inserting a method in a method.
I want to insert in every method of every class, a method.
But my class doesn't work and I have a IncompatibleClassChangeError error and I don't understand from where, could be the error.
Sorry for my english.
this is my code:
try {
JavaClass clazz = Repository.lookupClass("front.persistance.action.BlobClobInitAction");
ConstantPool constants = clazz.getConstantPool();
cp = new ConstantPoolGen(constants);
String nomStr = clazz.getClassName();
nomClasseStr = nomStr.substring(nomStr.lastIndexOf(".") + 1) + ".class";
//si les variables de la classe ne contiennent pas de logger
//on insere partt
Method[] methods = clazz.getMethods();
//on parcours toutes les methodes pour les rajouter
for (int i = 0; i < methods.length; i++) {
String methodeStr = methods[i].toString();
String nomMethodeStr = methodeStr.substring(0, methodeStr.indexOf("("));
nomMethodeStr = nomMethodeStr.substring(nomMethodeStr.lastIndexOf(" ") + 1);
if (!(nomMethodeStr.charAt(0) == '<'
&& nomMethodeStr.charAt(nomMethodeStr.length() - 1) == '>')) {
Method stripped = ajoutLogger(new MethodGen(methods[i], clazz.getClassName(), cp));
if (stripped != null) {
methods[i] = stripped; // on écrase la méthode par celle recrée
}
}
}
clazz.setConstantPool(cp.getFinalConstantPool());
clazz.dump(nomClasseStr);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
private Method ajoutLogger(MethodGen methodGen) {
try {
InstructionFactory factory = new InstructionFactory(cp);
InstructionList instructionFinalList = new InstructionList();
InstructionList instructionList = methodGen.getInstructionList();
instructionFinalList.append(new PUSH(cp, nomClasseStr));
instructionFinalList.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING }, Constants.INVOKESTATIC));
instructionFinalList.append(instructionList);
methodGen.setInstructionList(instructionFinalList);
methodGen.setMaxStack();
Method method = methodGen.getMethod();
instructionFinalList.dispose();
System.out.println(methodGen.getMethod().toString());
return method;
} catch (Exception e) {
System.err.println(e.getMessage());
return null;
}
}
Matthew
This e-mail and any attachment is for authorised use by the intended recipient(s) only. It may contain proprietary material, confidential information and/or be subject to legal privilege. It should not be copied, disclosed to, retained or used by, any other party. If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender. Thank you.