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!