Динамическая генерация класса специализации - PullRequest
2 голосов
/ 01 ноября 2011

Каков наилучший способ динамической генерации класса специализации с использованием абстрактного родительского класса?

Например, предположим, что это мой родительский класс:

public abstract class Parent {

    public Parent(int i) {
      // initialization here ...
    }

    @AnImportantAnnotation("")
    public abstract Object testMethod();
}

Тогда я бы хотелиметь метод, который получает абстрактный класс и возвращает его экземпляр, как, например:

public class Manager {
    public static <T> T getInstance(Class<T> c) {
        return <"instance of dynamically generated specialization class">;
    }

    public static void main(String[] args) {
        Parent parent = getInstance(Parent.class);
    }
}

Класс экземпляра, возвращаемый методом getInstance, переопределяет абстрактные методы, найденные в Parent класс.Код этих сгенерированных методов зависит от аннотаций их соответствующих родительских методов.

Кроме того, сгенерированный класс должен определять те же конструкторы, что и его родительский класс.Например, сгенерированный класс должен быть эквивалентен:

public class Son extends Parent {

    //generated constructor
    public Son(int i) {
        super(i);
    }

    public Object testMethod() {
        // dynamically generated behaviour guided by annotations on the overridden method
        return aReturnValue;
    }
}

Я бы предпочел указатели того, как сделать это только из памяти (без чтения / записи файлов на диск) и, если возможно, без использования внешних библиотек (например, Javassist).Тем не менее, объяснения методов в зависимости от таких библиотек также высоко оценены.Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 01 ноября 2011

С классами, я не думаю, что это возможно без такой библиотеки, как Javassist, однако, если вы можете использовать интерфейсы вместо абстрактных классов, вы можете использовать java.lang.reflect.Proxy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...