Как использовать механизмы отражения для вызова открытого метода, который находится в базовом классе с видимостью по умолчанию? - PullRequest
3 голосов
/ 09 ноября 2011

Этот вопрос касается механизмов отражения языка программирования 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). Вопрос в том, есть ли способ сохранить видимость (по умолчанию) и при этом вызывать метод сеттера с механизмами отражения?

1 Ответ

1 голос
/ 09 ноября 2011

В зависимости от того, какие ограничения безопасности у вас есть, вы можете использовать

AccessibleObject.setAccessible(boolean);

(AccessibleObject - это интерфейс, реализованный Field, Method, Constructor). Перед вызовом рефлексии просто вызовите method.setAccessible (true); на объекте отражений, и если SecurityManager не выдаст исключение, все будет в порядке.

...