Компилировать со ссылкой динамически загружаемый класс - PullRequest
1 голос
/ 29 марта 2012

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

public abstract AbstractClass {
    public abstract void F();
}

Предположим, у меня есть класс, назовем его ClassA. ClassA расширяет AbstractClass. ClassA сохраняется в папке. (Он должен быть загружен в путь к классам.) Теперь предположим, что я пишу новый класс в программе,

ClassB

и я хочу, чтобы ClassB мог ссылаться на ClassA. Что-то вроде

public class ClassB extends AbstractClass {

    ClassA A = new ClassA();

    public void F() {
         A.F();
    }

}

Теперь у меня не было проблем с использованием загрузчика классов, чтобы получить classA и использовать его динамически. У меня также не было проблем с написанием класса, подобного ClassA, динамически на основе пользовательского ввода, компиляцией его в программе (с использованием ecj.jar), а затем загрузкой и вызовом методов из него.

Я не могу понять, как ссылаться на динамически загруженный класс в классе, который я сейчас пишу и динамически компилирую. Я не знаю, как написать импорт и т. Д. Загрузка класса A и положить

импорт класса A;

в файл classB.java не работает.

Это мой первый вопрос о StackOverflow (долгое время читатель), так что будьте осторожны со мной. Заранее спасибо.

-

Контекст: программа, использующая распределения вероятностей, введенные пользователем. У меня есть абстрактный класс AbstractDistribution, в котором есть абстрактные методы для CDF, PDF, обратного CDF и т. Д. До сих пор это работало хорошо, динамически создавая компиляцию и загружая дистрибутивы, расширяющие AbstractDistribution, получая newInstance () из них и используя их как любые другой класс. Однако, если я написал и динамически загрузил дистрибутив Dist1, я хочу иметь возможность написать Dist2, который может вызывать (например) PDF-файл Dist1.

1 Ответ

2 голосов
/ 29 марта 2012

Не заставляйте B ссылаться на A напрямую - заставляйте B обращаться к AbstractClass и принимать ссылку на экземпляр в его конструкторе:

public class ClassB extends AbstractClass {

    private final AbstractClass other;

    public ClassB(AbstractClass other) {
        this.other = other;
    }

    public void F() {
         other.F();
    }    
}

На этом этапе вынужно выяснить, как вы собираетесь получить ссылку на другой экземпляр AbstractClass (будь то ClassA или что-то еще), но это избавляет от прямой зависимости.

Я уверен, что будут более точные детали, которые нужно проработать, но если вы сможете разорвать прямую зависимость, как это, это должно сделать аспект динамической компиляции менее проблемным.

...