为啥Java反射在另一个包中找不到一个类的包私有构造函数?

Posted

技术标签:

【中文标题】为啥Java反射在另一个包中找不到一个类的包私有构造函数?【英文标题】:Why can't Java Reflection find the package-private constructor of a class in another package?为什么Java反射在另一个包中找不到一个类的包私有构造函数? 【发布时间】:2014-09-26 11:46:12 【问题描述】:

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

public class Vec

    Vec(int x, int y, int z) /*implementation*/
    //other fields and methods irrelevant to question and not shown

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

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

但是,在运行上面的代码时,我在后面的代码的第一行得到了一个异常:

Exception in thread "main" java.lang.NoSuchMethodException: somePackages.Vec.<init>(int, int, int)

即使构造函数仍然存在,为什么它仍然给出该异常?如果有帮助,我将在我的 Raspberry Pi 上使用 oracle-java8-jdk 运行此代码。

【问题讨论】:

【参考方案1】:

Class#getConstructor(Object...)javadoc 状态

返回一个反映指定publicConstructor 对象 这个Class对象所代表的类的构造函数

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

使用getDeclaredConstructor(Object...)

【讨论】:

以上是关于为啥Java反射在另一个包中找不到一个类的包私有构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

在Java中的包级别打印构造函数[重复]

IntelliJ 编译时在同一个包中找不到类

反射(基础知识)

java利用反射来调用一个类的私有方法

为啥要用invoke方法换句话说就是在啥情况下使用invoke方法?

为啥反射type.GetFields 取不到任何值