Этот вопрос касается механизмов отражения языка программирования Java.
У меня есть интерфейс:
package A;
public interface MyInterface {
public boolean doSomething(Object... parameters);
}
У меня есть несколько классов реализации для этого интерфейса. Вот несколько примеров:
package B;
import A.*;
abstract class BaseImplementation implements MyInterface {
private Object field;
protected BaseImplementation() {
super();
}
public void setField(Object aField) {
field = aField;
}
public Object getField() {
return field;
}
}
package B;
import A.*;
public class ConcreteImplementation extends BaseImplementation {
public ConcreteImplementation() {
super();
}
...
// The concrete implementation provides an implementation for all
// inherited abstract methods. Apart from this no other methods
// are overridden.
// This concrete class provides accessor methods for all of its own
// private fields.
...
}
(отредактировано) В качестве обозначения (это может не относиться к вопросу о механизме отражения):
Я реализую сложный набор правил. Недостатком этого набора правил является то, что между объектами существует много взаимозависимостей. Таким образом, необходимо определить общее поведение с интерфейсами. При реализации одной части набора правил необходимо учитывать поведение другой, еще не реализованной части.
Разные реализации интерфейса требуют разных ресурсов / объектов для правильной работы. Для уменьшения дублирования кода я использую абстрактные родительские классы. Эти абстрактные классы не используются вне их пакетов.
При создании и инициализации экземпляра конкретного класса реализации я прибегаю к механизмам отражения. Для этой цели у меня есть служебный класс (который находится в отдельном пакете), в котором я должен указать желаемое имя класса, какое поле получает какое значение (т. Е. Затем будут найдены соответствующие методы установки) и порядок, в котором методы установки называются.
У меня есть две разные среды разработки, и на каждой установлена отдельная версия java (1.5.x и 1.6.x). Это в основном используется для перекрестной проверки поведения реализации.
Создание экземпляра конкретного класса реализации работает в обеих средах. Но
Сбой инициализации со старой версией Java. Каким-то образом открытый метод установки базового класса (базовый класс имеет видимость по умолчанию) недоступен. В более новой версии Java нет проблем с доступом к методу установки.
Я нашел один обходной путь - изменить видимость базового класса (по умолчанию -> public). Вопрос в том, есть ли способ сохранить видимость (по умолчанию) и при этом вызывать метод сеттера с механизмами отражения?