Я использую Javassist для генерации некоторых классов во время выполнения, и когда я делаю анонимные внутренние классы в этих классах, они сбой при попытке создать экземпляр объекта-объекта (насколько я могу судить)Проблема с анонимным внутренним классом в генерации класса Javassist
Я попытался реализовать простейшую версию того, что я пытаюсь сделать.
Я определяю 3 класса следующим образом:
public class A {
public int method() {
return 1;
}
}
public class B extends A {
}
public class C extends A {
public int method() {
return 5;
}
}
То, что я хочу сделать сейчас, это использование Javassist (или что-то еще, что я предполагаю), чтобы (во время выполнения) создать класс, который имеет все функциональные возможности C но расширяет B вместо а, мне это кажется, как вещь, которая была бы хорошо, так как B распространяется A. в настоящее время я делаю это следующим образом:
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get(C.class.getName());
cc.setName("newName");
cc.setSuperclass(cp.get(B.class.getName()));
B b = (B) cc.toClass().newInstance();
b.method();
Приведенный выше код работает отлично, когда я звоню метод (), но если я создаю анонимный внутренний класс в методе C() следующим образом:
public class C extends A {
public int method() {
try {
return new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 5;
}
}.call();
} catch (Exception e) {
return 2;
}
}
}
, когда я называю method()
я получаю java.lang.NoSuchMethodError: C$1.<init>(LnewName;)
ошибку.
Я не знаю JavaAssist, но похоже, что он не создает анонимный внутренний класс. Зачем вам это делать? Это похоже на симптом дизайна наследования дефектного объекта. –
Да, я делаю что-то довольно глупо, я согласен с тем, что мне, возможно, придется делать это по-другому, но предположил, что я могу спросить –