Вместо
final Class<?> aClass = saneYossarianClass.toClass(Yossarian.class.getClassLoader(), Yossarian.class.getProtectionDomain());
используйте
final Class<?> aClass = saneYossarianClass.toClass();
По некоторым причинам это работает для меня:
public final class SomeClassHavingFinals {
public final void sayHelloBoy() {
System.out.println("I am saying hello original");
}
}
И:
public static void main(String[] args)
throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException,
NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IOException {
ClassPool pool = ClassPool.getDefault();
CtClass clazz = pool.get("testapp.SomeClassHavingFinals");
clazz.defrost();
clazz.setModifiers(Modifier.PUBLIC);
clazz.getDeclaredMethod("sayHelloBoy").setModifiers(Modifier.PUBLIC);
clazz.toClass();
CtClass extension = pool.makeClass("SomeExtension");
extension.setSuperclass(clazz);
final CtMethod overrideMethod = CtNewMethod.make("public void sayHelloBoy() { System.out.println(\"Im overriden\"); }",
extension);
extension.addMethod(overrideMethod);
Object ei = extension.toClass().newInstance();
ei.getClass().getDeclaredMethod("sayHelloBoy").invoke(ei);
}
вывод
Я переопределен
, так что похоже, что он работает.Внутренние IDK, но кажется, что toClass () вызывает переопределение определения файла.