Class API中的getDeclaredConstructors和getConstructors有什么区别?

我注意到在Java Reflection API中有两种调用构造函数的方法: getDeclaredConstructors / getConstructors方法。 虽然Java文档略有不同( getDeclaredConstructors似乎暗示它返回的是所有构造函数,而不是公共函数),但不清楚API为什么明确支持这两种不同的方法。

更重要的是,我想知道:如果我们正在dynamic调用类,什么时候一种方法比另一种方法更可取? 例如,访问私有构造函数的目的是什么?

getDeclaredConstructors (当你想要所有的构造函数)

返回一个Constructor对象数组,该对象反映由此Class对象表示的类所声明的所有构造函数。 这些是公共的,受保护的,默认(包)访问和私有构造函数。

getConstructors (当你只需要public构造函数的时候)

返回一个包含Constructor对象的数组,该对象反映了由此Class对象表示的类的所有公共构造方法。

所以,看看他们两个的文档,我认为不同的是getConstructors只返回public构造函数,而getDeclaredConstructors返回所有的构造函数( publicprotected ,default(package)access和private

所以,如果只需要public构造函数,然后使用getConstructors 。 否则,如果您需要所有构造函数(不考虑构造函数的访问修饰符),则使用getDeclaredConstructors

方法'getDeclaredConstructors'只返回在类中声明的构造函数。 getConstructors方法还返回在类中没有声明但是从超类inheritance的构造函数。

所以这取决于你要做什么。 没有正确的做法,这真的取决于你是否也需要超级构造函数。

getDeclaredXX()方法的存在是为了通过这些类的创build者不一定想要的方式来操作类。 请注意,有一个getDeclaredMethod()方法允许您调用私有方法, getDeclaredField()方法允许您获取/设置私有字段。

我不完全确定“合法的”用例,但是这对于做某些事情显然是有用的。 而且,这个方法族只返回在类中专门声明的东西,而不是由于超类而存在于类中的东西。

访问一个私有的构造函数可能会出于同样的原因,我想。

我使用getDeclaredConstructors来创build一个类的构造函数是私人的工厂,以避免我的系统的“用户”可以直接创build这些类而不使用工厂。 我觉得这个方法非常有用。