如何使用反射实例化非公开的最终类?

时间:2011-09-26 02:25:43

标签: java reflection

我有一个非公开的决赛课,如下所示:

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 个答案:

答案 0 :(得分:2)

根据JavaDocs,您可以调用getDeclaredConstructors()方法,您将获得所有私有构造函数以及默认构造函数。

  

public Constructor [] getDeclaredConstructors()                                            抛出SecurityException

Returns an array of Constructor objects reflecting all the
     

由此Class对象表示的类声明的构造函数。   这些是公共的,受保护的,默认(包)访问和私有   构造函数。返回的数组中的元素未排序   没有任何特定的顺序。如果该类有默认值   构造函数,它包含在返回的数组中。此方法返回   如果此Class对象表示接口,则为长度为0的数组   原始类型,数组类或void。

See The Java Language Specification, section 8.2.

它没有指定你正在使用的getDeclaredConstructor(Class ... parameterTypes)方法究竟是如何工作的。

答案 1 :(得分:0)

我猜,但我认为它是抱怨类的可访问性而不是(只是)构造函数。

尝试在setAccessible(true)对象和Class对象上调用Constructor

答案 2 :(得分:0)

嗯,它似乎是用户错误。使用问题中概述的构造函数方法确实可以正常工作。