我注意到在Java Reflection API中有两种不同的方法来调用构造函数:getDeclaredConstructors
/ getConstructors
方法。虽然Java文档略有不同(getDeclaredConstructors
似乎暗示它返回所有构造函数而不是公共构造函数),但不清楚为什么API明确支持这两种不同的方法。
更重要的是,我想知道:如果我们动态调用类,一个方法何时会优于另一个方法?例如,访问私有构造函数的目的是什么?
答案 0 :(得分:57)
getDeclaredConstructors
(当你想要所有构造函数时)
返回Constructor对象的数组,这些对象反映由此Class对象表示的类声明的所有构造函数。这些是公共的,受保护的,默认(包)访问和私有构造函数。
getConstructors
(当您想要仅public
构造函数时)
返回一个包含Constructor对象的数组,这些对象反映了此Class对象所代表的类的所有公共构造函数。
因此,查看两者的文档,我认为不同之处在于getConstructors
仅返回public
构造函数,而getDeclaredConstructors
返回所有构造函数(public
, protected
,默认(包)访问权限和private
)
因此,如果您只需要public
构造函数然后使用getConstructors
,那么很容易。否则,如果您需要所有构造函数(忽略构造函数的access-modifier),则使用getDeclaredConstructors
。
答案 1 :(得分:4)
getDeclaredXX()
方法存在用于操作类的方法,这些方法不一定是那些类的制造者所期望的。请注意,有一个允许您调用私有方法的getDeclaredMethod()
方法,以及允许您获取/设置私有字段的getDeclaredField()
方法。
我不完全确定“合法”用例,但这些对于做某些事情显然很有用。此外,这个方法系列只返回类中特别声明的内容,而不是由于超类而返回类中存在的内容。
我想,访问私有构造函数可能会有相同的原因。
答案 2 :(得分:2)
方法'getDeclaredConstructors'仅返回在类中声明的构造函数。方法'getConstructors'也返回未在类中声明但从超类继承的构造函数。
所以这取决于你要做什么。没有正确的方法,这取决于你是否还需要超级构造函数。
答案 3 :(得分:0)
我使用getDeclaredConstructors
创建一个类的工厂,其构造函数是私有的,以避免我的系统的“用户”可以直接创建这些类而不使用工厂。我发现这种方法非常有用。