I don't see a problem with the code you included. The numbers after the lines are (I *believe*) the constant pool indexes of the various constants and this shouldn't affect the execution of your program.
Could you explain what you mean by "it doesn't work"? Do you get an exception, error message, etc.? Also, if you could post the complete source or a reproducible test case that would help. -----Original Message----- From: Camila Rocha [mailto:[EMAIL PROTECTED] Sent: Tuesday, February 10, 2004 8:55 AM To: [EMAIL PROTECTED] Subject: The changes don't work Hello, I am a beginner, and I have a doubt... I want to modify an existing class. So, I used BCELifier to generate the code of the class, and then tried to used it to modify my class. The modification is a call to a static method called Monitor.incluirTraceEstado(String), passing ("Par = " + par) as a parameter (par is int private attribute). When I insert the call in the source code, without using BCEL, the code of the method that calls de static method is this (just the beginning): Code(max_stack = 3, max_locals = 3, code_length = 88) 0: new <java.lang.StringBuffer> (6) 3: dup 4: invokespecial java.lang.StringBuffer.<init> ()V (7) 7: ldc "Par = " (8) 9: invokevirtual java.lang.StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer; (9) 12: iload_1 13: invokevirtual java.lang.StringBuffer.append (I)Ljava/lang/StringBuffer; (10) 16: invokevirtual java.lang.StringBuffer.toString ()Ljava/lang/String; (11) 19: invokestatic Monitor.incluirTraceEstado (Ljava/lang/String;)V (12) 22: aload_0 23: getfield Fila.vetor_par [I (2) 26: aload_0 27: getfield Fila.ipar I (4) But, when I insert it using BCEL, the code is this (lines 0 to 19 are new). It's almost the same, the differences are some number in lines 7 and 19. And it doesn't work! 0: new <java.lang.StringBuffer> (7) 3: dup 4: invokespecial java.lang.StringBuffer.<init> ()V (8) 7: ldc "Par = " (76) 9: invokevirtual java.lang.StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer; (10) 12: iload_1 13: invokevirtual java.lang.StringBuffer.append (I)Ljava/lang/StringBuffer; (11) 16: invokevirtual java.lang.StringBuffer.toString ()Ljava/lang/String; (13) 19: invokestatic Monitor.incluirTraceEstado (Ljava/lang/String;)V (74) 22: aload_0 23: getfield Fila.vetor_par [I (2) 26: aload_0 27: getfield Fila.ipar I (4) My question is: what are these numbers? Are they causing the problem? How can I fix this code? The BCEL code that I wrote to create it is: (I'm inserting the last instruction first, and so on... ) JavaClass clazz = Repository.lookupClass("Fila"); Method[] methods = clazz.getMethods(); ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); MethodGen mg = new MethodGen(methods[1], clazz.getClassName(), cp); InstructionList il = mg.getInstructionList(); InstructionFactory factory = new InstructionFactory(cp); il.insert(factory.createInvoke("Monitor", "incluirTraceEstado", Type.VOID, new Type[] { Type.STRING }, (short)184)); il.insert(factory.createInvoke("java.lang.StringBuffer", "toString", Type.STRING, Type.NO_ARGS, (short)182)); il.insert(factory.createInvoke("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.INT }, (short)182)); il.insert(factory.createLoad(Type.INT, 1)); il.insert(factory.createInvoke("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.STRING }, (short)182)); il.insert(new PUSH(cp, "Par = ")); il.insert(factory.createInvoke("java.lang.StringBuffer", "<init>", Type.VOID, Type.NO_ARGS, (short)183)); il.insert(InstructionConstants.DUP); InstructionHandle ih_0 = il.insert(factory.createNew("java.lang.StringBuffer")); methods[1] = mg.getMethod(); Sorry about the huge email and my poor English! I'll be very glad with some help. Thanks! Camila Rocha ------------------------------------------------------------------------ Master Student in Computer Science Institute of Computing - UNICAMP - Brazil www.ic.unicamp.br/~ra022247 --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
