2014-01-31 3 views
1

Я использую 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;) ошибку.

+0

Я не знаю JavaAssist, но похоже, что он не создает анонимный внутренний класс. Зачем вам это делать? Это похоже на симптом дизайна наследования дефектного объекта. –

+0

Да, я делаю что-то довольно глупо, я согласен с тем, что мне, возможно, придется делать это по-другому, но предположил, что я могу спросить –

ответ

2

В то время как я бы хотел, чтобы кто-то сказать мне по-другому, я думаю, что это не может быть возможно с Javassist, я нашел следующую строку в разделе 4.7 Javassist урока:

«Внутренние классы или анонимные классы не поддерживаются «.

Так что я предполагаю, что я должен смотреть в другие библиотеки поколения класса выполнения

+0

Внутренние классы поддерживаются, но только статические –

2

Javassist не поддерживает нестатические внутренние классы.
См. Javadoc для метода CtClass.makeNestedClass(String nestedClassName,boolean isStatic).
Ваша проблема не может быть решена, если вы не перейдете на верхний уровень внутреннего класса anon.

+0

Я попробовал API-интерфейс makenestedclass, добавив объект класса в CtClass но когда я преобразовал объект CtClass в объект класса, внутреннего класса там нет. Насколько я прочитал, будет проблема в преобразовании байтового кода внутреннего класса см. Это https://github.com/jboss-javassist/javassist/issues/6 – Sudarshan

Смежные вопросы