为什么Java Reflection不能在另一个包中找到类的包私有构造函数?

gpa*_*ani 0 java reflection constructor nosuchmethod

我有以下API代码,为简洁起见缩短了:

public class Vec
{
    Vec(int x, int y, int z) {/*implementation*/}
    //other fields and methods irrelevant to question and not shown
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试在与上面的类不同的包中编写代码,该类使用反射来调用该类的构造函数并创建它的新实例.这是我尝试过的(下面的代码在我的应用程序的main方法中):

Constructor<Vec> c = Vec.class.getConstructor(Integer.TYPE, Integer.TYPE, Integer.TYPE);
c.setAccessible(true);
Vec newVec = c.newInstance(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

但是,运行上面的代码时,后一代码的第一行会出现异常:

Exception in thread "main" java.lang.NoSuchMethodException: somePackages.Vec.<init>(int, int, int)
Run Code Online (Sandbox Code Playgroud)

为什么它仍然提供该异常,即使该构造函数仍然存在?我正在使用oracle-java8-jdk我的Raspberry Pi 运行此代码,如果这有帮助的话.

Sot*_*lis 6

Class#getConstructor(Object...) 贾瓦多克说

返回一个Constructor对象,该对象反映publicClass对象表示的类的指定构造函数

你的构造函数不是public.它没有访问修饰符,因此是包私有的.

使用getDeclaredConstructor(Object...).