2016-01-06 3 views
2

мой процессор аннотаций читает класс вроде этого:Сформировать внутренний класс

@Foo 
public class Bar(){ 

} 

Теперь я хочу, чтобы создать внутренний класс Bar$MyGeneratedClass, так что в конце концов у меня есть класс MyGeneratedClass, что компилятор/JVM выглядит следующим образом :

public class Bar(){ 

    // Generated by annotation processor 
    public static class MyGeneratedClass() { ... } 
} 

Возможно ли это? Думаю, что так, наверное, мне просто нужно назвать сгенерированный класс Bar$MyGeneratedClass справа?

Кто-нибудь знает, как создать такой внутренний класс с помощью java-поэта?

+0

Это звучит немного как аспектно-ориентированное программирование (AOP) – vikingsteve

+0

Почему вы хотите, чтобы это был «внутренний класс» Используете ли вы какую-то структуру, которая различает внутренние классы и обычные классы? –

+0

@vikingsteve Нет, я хочу сделать это во время компиляции – sockeqwe

ответ

0

Вы можете использовать javapoet для создания новых классов. Невозможно изменить существующий класс с помощью javapoet.

0

На уровне jvm нет таких предметов, как внутренние классы. Таким образом, при компиляции обоих классов (внутренний и внешний) преобразуются для имитации этого эффекта.

  • Внутренний класс получает параметр конструктора. С этим параметром вам нужно передать экземпляр внешнего класса.
  • Поскольку оба типа классов могут получить доступ к частным частям, создаются частные аксессоры.

В частности, для второй трансформации требуется изменить внешний класс.

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