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