Как печатать приведение с помощью отражения, когда класс закрыт - PullRequest
0 голосов
/ 06 июля 2019

Во-первых, это похоже на этот вопрос , но никогда не было удовлетворительного ответа. Второе: я знаю, я знаю, отражение плохое, но это единственный вариант, который у меня есть.

Вопрос: Учитывая класс

package a.pkg.outside.my.code;

class ClassIWant {   // Package private class
    public ClassIWant instance() {...}
}

Я хочу позвонить instance(), получить экземпляр ClassIWant и вернуть ClassIWant (не Object).

Я могу успешно позвонить instance через отражение и получить в свои руки Object:

public class MyClass {
    /* type var T will always take value ClassIWant. I can currently get
     * get this to type check by using Class.cast and changing return
     * type to T, but this doesn't solve my problem.
     */
    public <T> ClassIWant callInstance() {  // Here T is ClassIWant
        Class<T> clazz = Class.forName("a.pkg.outside.my.code.ClassIWant");
        Object result = _use reflection_;
        return (ClassIWant) result;         // Fails at runtime
    }
}

Проблема в том, что у меня нет доступа к ClassIWant для каста, и лучшее, что я смог сделать, это позвонить clazz.cast(result). Это возвращает тип T, который не совсем делает то, что я хочу.

Мне даже не ясно, что это возможно, но моя программа проверяла тип и получала ошибки недопустимого доступа во время выполнения. Это говорит мне о том, что все биты и кусочки соответствуют друг другу на уровне типа, и что все методы указывают на правильное место.

Примечание: Может быть возможно изменить мой вариант использования, чтобы не нуждаться в явном ClassIWant, но это, вероятно, будет изрядное количество работы (т. Е. Много-много призывов к размышлению) , Для краткости я не включил вариант использования - я буду рассматривать это как второй вопрос, если это будет необходимо.

Редактировать: Обновлено в ответ на комментарий Энди Тернера (спасибо за улов): более подробно, я не использую здесь явно T, но у меня есть доступ к нему, и я хочу сделайте это явным

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