Awesome Arin, the class is now saved properly. Next step will now be to get the new class running. Stay tuned.
Klaus. -------- Original-Nachricht -------- > Datum: Tue, 10 Feb 2009 16:27:08 +1100 > Von: Arrin Daley <arrin.da...@anu.edu.au> > An: BCEL Users List <bcel-user@jakarta.apache.org> > Betreff: Re: How to replace a complete instruction in J2ME Bytecode > Hi Klaus > > I've primarily only used JavaClass but should've probably used ClassGen. > > Do you do a MethodGen.getMethod()? this returns a Method object which > you should then make part of the JavaClass (via JavaClass.setMethods()) > or ClassGen (via setMethods() or setMethodAt()) which you got the method > from. Your supposed to do a setMaxStack() and setMaxLocals() before a > call to getMethod() but your changes shouldn't change the stack or local > variables, but it's probably good practice. > > You will also have to get a ConstantPool via > ConstantPoolGen.getFinalConstantPool() and make this part of your > JavaClass, I don't think it's required for ClassGen as I think it > happens when you ask for a JavaClass, not sure though, you might need to > check. > Note: sorry I remembered constant pools being associated with methods > but they're associated with the class. > > Basically you need to make sure your changes take effect in the > JavaClass before you dump it, so ConstantPoolGen needs to create a new > ConstantPool, MethodGen needs to create a new Method, and ClassGen (if > you use it) needs to create a new JavaClass, otherwise the JavaClass > will continue to have the old state and that's what will be dumped. > ClassGen may take care of some of this for you via getJavaClass(). > > Hope it helps, > > Bye Arrin > > > Klaus Teller wrote: > > Hi Arin, > > > > Thanks for your feedback; very insightful. I went through all the steps, > identified the right invokestatic, added it into the constant pool, and > updated the index of the invokestatic. > > > > Right now, the only issue i'm having is that the dump doesn't include my > changes, which might indicate that something is missing. > > > > Any idea? > > > > If you wish, i can send you the code offline. > > > > Thanks again, > > > > Klaus. > > > > > > -------- Original-Nachricht -------- > > > >> Datum: Tue, 10 Feb 2009 12:32:16 +1100 > >> Von: Arrin Daley <arrin.da...@anu.edu.au> > >> An: BCEL Users List <bcel-user@jakarta.apache.org> > >> Betreff: Re: How to replace a complete instruction in J2ME Bytecode > >> > > > > > >> Hi Klaus > >> > >> You'll need to find the INVOKESTATIC instruction first, if you have an > >> idea which methods and classes the call(s) exist in this will help, > >> InstructionFinder is about finding a pattern of instructions you could > >> use it to find INVOKESTATIC instructions but that would probably be > >> overkill, you could just use an iterator or something similar. > >> > >> Once you have found the INVOKESTATIC instructions you could then test > to > >> see which one(s) match your function call, you could do this by looking > >> at the classname and method name and possibly arguments the other way > >> would be to look up the index for the method in the constant pool (if > it > >> exists in the constant pool, don't put it in if it doesn't) and compare > >> this index to that of the INVOKESTATIC instruction which you have > found. > >> If the static method doesn't exist in the constant pool then there > isn't > >> a call to that static method in the code your currently looking at so > >> you could move on to the next method to search. > >> > >> Once you find an INVOKESTATIC that matches you need to put your new > >> static method in the constant pool via a ConstantPoolGen, this will > >> return an index which you can then use with the setIndex method on the > >> INVOKESTATIC instruction. You can use the setIndex because you are just > >> changing the target of INVOKESTATIC instructions, otherwise you would > >> have to replace the instruction itself. > >> > >> I'm not sure what other finalising things you will need to do, the > >> ConstantPool, ConstantPoolGen will have changed so will need to > >> finalise that, and you will have to get a Method from the MethodGen > >> object you previously had but I think that's about all... > >> > >> Another way might be to define an InstructionVisitor overriding the > >> visit method for INVOKESTATIC to find and edit the appropriate > >> instructions. > >> > >> Hope it helps > >> > >> Bye Arrin > >> > >> Klaus Teller wrote: > >> > >>> Hi Folks, > >>> > >>> I have a J2ME Library that contains the following instruction: > >>> > >>> invokestatic > >>> > >> > javax/microedition/io/Connector/open(Ljava/lang/String;IZ)Ljavax/microedition/io/Connection; > >> > >>> I would like to replace it with: > >>> > >>> invokestatic > >>> > >> > mypackage/AlphaConnector/open(Ljava/lang/String;IZ)Ljavax/microedition/io/Connection; > >> > >>> What do i need to do? > >>> > >>> I couldn't find a way to search instruction based on the operand (that > >>> > >> is the second part of the instruction). I tried IntructionFinder; but > it > >> couldn't help me. > >> > >>> I would very much appreciate any input. > >>> > >>> Thanks, > >>> Klaus. > >>> > >>> > >>> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: bcel-user-unsubscr...@jakarta.apache.org > >> For additional commands, e-mail: bcel-user-h...@jakarta.apache.org > >> > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: bcel-user-unsubscr...@jakarta.apache.org > For additional commands, e-mail: bcel-user-h...@jakarta.apache.org -- Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger01 --------------------------------------------------------------------- To unsubscribe, e-mail: bcel-user-unsubscr...@jakarta.apache.org For additional commands, e-mail: bcel-user-h...@jakarta.apache.org