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

У меня есть закрытый финальный класс, который выглядит следующим образом:

final class FragmentManagerImpl {
    ...
}

Обратите внимание, что он не является общедоступным и не имеет объявленных конструкторов.

Я хотел бы создать экземпляр этого класса, используя отражение. Однако оба следующих фрагмента кода приводят к IllegalAccessExceptions:

        // BUG IllegalAccessException on calling newInstance
        final Class c = Class.forName("android.support.v4.app.FragmentManagerImpl");
        c.newInstance();

        // BUG IllegalAccessException on calling newInstance
        final Class c = Class.forName("android.support.v4.app.FragmentManagerImpl");
        final Constructor constructor = c.getDeclaredConstructor();
        constructor.setAccessible(true);
        constructor.newInstance();

Как правильно создать экземпляр этого класса из пакета, который не является android.support.v4.app?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

Согласно JavaDocs , вы можете вызвать метод getDeclaredConstructors (), и вы получите все частные конструкторы, а также конструктор по умолчанию.

открытый конструктор [] getDeclaredConstructors() создает исключение SecurityException

Returns an array of Constructor objects reflecting all the

, объявленное классом, представленным этим объектом Class.Это открытый, защищенный, доступ по умолчанию (пакет) и частные конструкторы.Элементы в возвращаемом массиве не сортируются и не располагаются в каком-либо определенном порядке.Если класс имеет конструктор по умолчанию, он включается в возвращаемый массив.Этот метод возвращает массив длины 0, если этот объект Class представляет интерфейс, тип примитива, класс массива или void.

See The Java Language Specification, section 8.2.

Он не определяет, как именно этот getDeclaredConstructor (ClassМетод ... parameterTypes), который вы используете, будет работать, хотя.

0 голосов
/ 26 сентября 2011

Хм, похоже, ошибка пользователя.Использование метода конструктора, описанного в вопросе, похоже, сработало правильно.

0 голосов
/ 26 сентября 2011

Я предполагаю, но я думаю, что он жалуется на доступность класса, а не (просто) конструктора.

Попробуйте вызвать setAccessible(true) для объекта Class, а также для объекта Constructor.

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