首先,这类似于this question,但从未有令人满意的答案。第二:我知道,我知道反射不好,但这是我唯一的选择。
问题:已授课
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
,但这可能需要大量的工作(例如,大量的呼叫反思)。为简便起见,我没有包括用例-如果需要的话,我将其作为第二个问题。
编辑:已更新,以回应Andy Turner的评论(感谢您的关注):更详细地,我在此处未明确使用T
,但我可以访问它,并且我想明确一点