2012-03-29 2 views
1

Сначала предположим, что у меня есть абстрактный класс, назовем его 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), а затем загрузки его и вызова методов из него.

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

import classA;

в файл класса В. Это не трюк.

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

-

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

+0

Почему класс B не может расширять класс A? – Jasonw

+0

@ jasonw, приведенный выше пример является действительно урезанным примером. Предположим, что у меня были классы ClassA1 и ClassB1, я мог бы хотеть 'class ClassB { ClassA1 A1 = новый ClassA1(); ClassA2 A2 = новый ClassA2(); общественная пустота F() { A1.F(); A2.F(); } } ' – richard

+0

okay Ричард, некоторые гуру прольют некоторый свет здесь, я надеюсь :-) – Jasonw

ответ

2

Не делайте 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 или что-то еще), но он избавляется от прямой зависимости.

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

+0

Thank @JohnSkeet. Это не совсем то, что я ищу, поскольку я хочу, чтобы пользователи имели возможность жесткого кода в ссылке. То есть у меня есть JTextFields, где они в основном определяют содержимое различных методов, которые должны быть записаны в новый класс и скомпилированы. Так, например, если 'ClassA' уже динамически написан и загружен, я хочу, чтобы они могли написать что-то вроде« new ClassA(). F() »и иметь эту компиляцию. Это может быть невозможно. :( – richard

+0

@richard: Хорошо, если вы включаете динамически скомпилированный класс в путь к классам, который вы используете в компиляции. Вы не много говорили о шаге компиляции. –

+0

Я получил его на работу, вы были прямо о пути к классу компилятора.Когда я передал '-classpath [каталог с динамически написанными классами]' в аргумент 'options' функции' 'JavaCompiler.getTask (...)', он отлично работал ** Спасибо. Теперь, когда я разобрался, мне приходится иметь дело с кошмаром управления кросс-классовыми зависимостями, которые могут создать мои пользователи ... – richard

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