I recommend BCEL 6. You can also use ASM, but I heard BCEL is easier to use. Below is a quick method for creating the final field:
public static void main(String[] args) throws Exception { System.out.println(F.class.getField("a").getModifiers()); JavaClass aClass = Repository.lookupClass(F.class); ClassGen aGen = new ClassGen(aClass); for (Field field : aGen.getFields()) { if (field.getName().equals("a")) { int mods = field.getModifiers(); field.setModifiers(mods | Modifier.FINAL); } } final byte[] classBytes = aGen.getJavaClass().getBytes(); ClassLoader cl = new ClassLoader(null) { @Override protected synchronized Class<?> findClass(String name) throws ClassNotFoundException { return defineClass("F", classBytes, 0, classBytes.length); } }; Class<?> fWithoutDeprecated = cl.loadClass("F"); System.out.println(fWithoutDeprecated.getField("a").getModifiers()); }
Of course, you would write your classes to disk as files, and then jar them, but it's easier to try. I don't have BCEL 6 support, so I can't change this example to remove annotations, but I think the code would be something like this:
public static void main(String[] args) throws Exception { ... ClassGen aGen = new ClassGen(aClass); aGen.setAttributes(cleanupAttributes(aGen.getAttributes())); aGen.getFields(); for (Field field : aGen.getFields()) { field.setAttributes(cleanupAttributes(field.getAttributes())); } for (Method method : aGen.getMethods()) { method.setAttributes(cleanupAttributes(method.getAttributes())); } ... } private Attribute[] cleanupAttributes(Attribute[] attributes) { for (Attribute attribute : attributes) { if (attribute instanceof Annotations) { Annotations annotations = (Annotations) attribute; if (annotations.isRuntimeVisible()) { AnnotationEntry[] entries = annotations.getAnnotationEntries(); List<AnnotationEntry> newEntries = new ArrayList<AnnotationEntry>(); for (AnnotationEntry entry : entries) { if (!entry.getAnnotationType().startsWith("javax")) { newEntries.add(entry); } } annotations.setAnnotationTable(newEntries); } } } return attributes; }
John watts
source share