Hi,

I was trying to use BCEL to replace the initial value of static final fields of 
existing classes. It seemed to work fine, but when the fields are referenced 
from other classes they seem to contain the old values, eventhough the values 
in the changed class itself are updated to the new value. Is there any way 
using BCEL to change these constant values in that way? Maybe I'm not aware of 
certain problems regarding the constant pool?

Here is what I did. Let's say, in a class named "Hello" I have a field like 
this:

public static final String MESSAGE = "Hello";

Now I want to read in the class file and change the initial value:

ClassParser parser = new ClassParser("Hello.class");
JavaClass javaClass = parser.parse();
ClassGen cg = new ClassGen(javaClass);
ConstantPool cp = javaClass.getConstantPool();
ConstantPoolGen pg = new ConstantPoolGen(cp);

Field[] fields = classGen.getFields();
for (int i=0; i<fields.length; i++) {
if (fields[i].getName().equals("MESSAGE")) {
FieldGen fg = new FieldGen(ACC_PUBLIC | ACC_STATIC | ACC_FINAL, Type.STRING, 
"MESSAGE", pg)
fg.setInitialValue("New Message");
cg.removeField(fields[i]);
cg.addField(fg.getFielD());
}
}
JavaClass changedClass = cg.getJavaClass();
changedClass.setConstantPool(pg.getFinalConstantPool());
changedClass.dump("Hello_.class");

Thanks
Matt
______________________________________________________________
Verschicken Sie romantische, coole und witzige Bilder per SMS!
Jetzt bei WEB.DE FreeMail: http://f.web.de/?mc=021193


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to