Hello!
I wrote a class that removes final modifier from given classes, here's the most relevant method:
public void instrument(CtClass clazz) {
int modifiers = clazz.getModifiers();
if (Modifier.isFinal(modifiers)) {
logger.info("Will remove final modifier from class: " + clazz.getName());
logger.debug("Old modifiers: " + Modifier.toString(modifiers));
int newModifiers = Modifier.clear(modifiers, Modifier.FINAL);
logger.debug("New modifiers: " + Modifier.toString(newModifiers));
clazz.setModifiers(newModifiers);
} else {
logger.debug("Class is not final, nothing do change: " + clazz.getName());
}
}Exception in thread "main" java.lang.RuntimeException: cannot set to static at javassist.CtClassType.setModifiers(CtClassType.java:374)
307 [ main] TRACE mon.javassist.FileInstrumenter - Current jar entry: com/sun/corba/se/impl/corba/AnyImpl$AnyInputStream.class 307 [ main] INFO y.framework.utils.FinalRemover - Will remove final modifier from class: com.sun.corba.se.impl.corba.AnyImpl$AnyInputStream 308 [ main] DEBUG y.framework.utils.FinalRemover - Old modifiers: static final 308 [ main] DEBUG y.framework.utils.FinalRemover - New modifiers: static
public void setModifiers(int mod) {
if (Modifier.isStatic(mod))
throw new RuntimeException("cannot set to static");
checkModify();
int acc = AccessFlag.of(mod) | AccessFlag.SUPER;
getClassFile2().setAccessFlags(acc);
}
I changed setModifier(). Now it accepts "static" modifier if the class is already a nested static class.
Thanks!