类为包私有时如何通过反射键入强制类型转换

时间:2019-07-06 19:18:42

标签: java reflection

首先,这类似于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,但我可以访问它,并且我想明确一点

0 个答案:

没有答案