В небольшом каркасе, который я создаю, я хотел бы изменить некоторые абстрактные классы на неабстрактные с помощью Javassist.Я уже преобразовал все абстрактные методы в неабстрактные, реализующие динамически сгенерированный код, который мне нужен.Но мне пока не удалось сделать класс неабстрактным.Я попробовал нечто похожее на это:
Допустим, c
- это класс, который я хотел бы сделать неабстрактным.Поэтому я написал:
public void instrument(Class c) {
...//some ignored exception management
CtClass ctClass = ClassPool.getDefault().get(c.getName());
ctClass.setModifiers(c.getModifiers() & ~Modifier.ABSTRACT);
return ctClass.toClass().newInstance();
}
Тем не менее, вызов:
ctClass.toClass();
поднимает следующее CannotCompileException
:
"attempted duplicate class definition for name: <class_name>."
Это потому, чтокласс уже загружен, так как я вызываю его метод getName
.Мне кажется, это единственный механизм, который я должен получить CtClass
из существующего класса, но, пожалуйста, кто-нибудь, скажите мне, если это не правильно.Жесткое кодирование имени класса вместо вызова его метода getName
далеко не идеальное решение, учитывая, что мне нужно применить эту процедуру ко многим классам.
Любой обходной путь для этого?Если это вообще невозможно, я буду динамически генерировать новый класс, который расширяет абстрактный класс, реализует его конструкторы и абстрактный метод всех его предков (немного сложнее, поэтому я был бы очень рад, если бы мне удалось просто сделатьвместо этого оригинальный класс, не являющийся абстратом).