Java 如何使用反射实例化非公共final类?

Java 如何使用反射实例化非公共final类?,java,reflection,Java,Reflection,我有一个非公开的期末课程,如下所示: final class FragmentManagerImpl { ... } 请注意,它不是公共的,并且没有声明的构造函数 我想使用反射实例化这个类的一个实例。但是,以下两个代码段都会导致IllegalAccessException: // BUG IllegalAccessException on calling newInstance final Class c = Class.forName("android

我有一个非公开的期末课程,如下所示:

final class FragmentManagerImpl {
    ...
}
请注意,它不是公共的,并且没有声明的构造函数

我想使用反射实例化这个类的一个实例。但是,以下两个代码段都会导致IllegalAccessException:

        // 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的包中实例化这个类的正确方法是什么?

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

尝试在
对象以及
构造函数
对象上调用
setAccessible(true)

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

公共构造函数[]getDeclaredConstructors() 抛出SecurityException

Returns an array of Constructor objects reflecting all the
由该类对象表示的类声明的构造函数。 它们是公共的、受保护的、默认(包)访问和私有的 构造器。返回的数组中的元素未排序,因此 没有任何特定的顺序。如果类具有默认值 构造函数,它包含在返回的数组中。此方法返回 长度为0的数组如果该类对象表示接口 基元类型、数组类或void

See The Java Language Specification, section 8.2.

它没有指定您正在使用的getDeclaredConstructor(Class…parameterTypes)方法的具体工作方式。

Hm,这似乎是用户错误。使用问题中概述的构造函数方法似乎工作正常。

我不相信类有setAccessible()方法不确定我是否理解您建议的修复方法。我建议改为调用getDeclaredConstructors()方法,并遍历列表以查看是否可以看到任何构造函数。是的,我可以看到默认的构造函数。如果您尝试使用此构造函数创建新实例,我假设您仍然会得到IllegaccessException。这是因为您无权访问类的定义。这个类是受包保护的,你没有办法用它来创建一个实例。我试了两次,第二次把NoConstructorClass放在一个完全不同的包中。您的第二种方式在我的jdk6+eclipse上运行正确。谢谢swanliu,我同意。这似乎是用户错误,请参阅下面我的答案。不幸的是,SO不会让我删除这个问题,标记我的答案是否正确,或者投票表决。