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

时间:2011-11-23 21:16:10

标签: java reflection constructor

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

更重要的是,我想知道:如果我们动态调用类,一个方法何时会优于另一个方法?例如,访问私有构造函数的目的是什么?

4 个答案:

答案 0 :(得分:57)

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

  

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

getConstructors(当您想要public 构造函数时)

  

返回一个包含Constructor对象的数组,这些对象反映了此Class对象所代表的类的所有公共构造函数。

因此,查看两者的文档,我认为不同之处在于getConstructors仅返回public构造函数,而getDeclaredConstructors返回所有构造函数(publicprotected,默认(包)访问权限和private

因此,如果您只需要public构造函数然后使用getConstructors,那么很容易。否则,如果您需要所有构造函数(忽略构造函数的access-modifier),则使用getDeclaredConstructors

答案 1 :(得分:4)

getDeclaredXX()方法存在用于操作类的方法,这些方法不一定是那些类的制造者所期望的。请注意,有一个允许您调用私有方法的getDeclaredMethod()方法,以及允许您获取/设置私有字段的getDeclaredField()方法。

我不完全确定“合法”用例,但这些对于做某些事情显然很有用。此外,这个方法系列只返回类中特别声明的内容,而不是由于超类而返回类中存在的内容。

我想,访问私有构造函数可能会有相同的原因。

答案 2 :(得分:2)

方法'getDeclaredConstructors'仅返回在类中声明的构造函数。方法'getConstructors'也返回未在类中声明但从超类继承的构造函数。

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

答案 3 :(得分:0)

我使用getDeclaredConstructors创建一个类的工厂,其构造函数是私有的,以避免我的系统的“用户”可以直接创建这些类而不使用工厂。我发现这种方法非常有用。