我有一个非公开的决赛课,如下所示:
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的包中实例化此类的正确方法是什么?
答案 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)
嗯,它似乎是用户错误。使用问题中概述的构造函数方法确实可以正常工作。