Class API中的getDeclaredConstructors和getConstructors有什么区别?
我注意到在Java Reflection API中有两种调用构造函数的方法: getDeclaredConstructors
/ getConstructors
方法。 虽然Java文档略有不同( getDeclaredConstructors
似乎暗示它返回的是所有构造函数,而不是公共函数),但不清楚API为什么明确支持这两种不同的方法。
更重要的是,我想知道:如果我们正在dynamic调用类,什么时候一种方法比另一种方法更可取? 例如,访问私有构造函数的目的是什么?
getDeclaredConstructors
(当你想要所有的构造函数)
返回一个Constructor对象数组,该对象反映由此Class对象表示的类所声明的所有构造函数。 这些是公共的,受保护的,默认(包)访问和私有构造函数。
getConstructors
(当你只需要public
构造函数的时候)
返回一个包含Constructor对象的数组,该对象反映了由此Class对象表示的类的所有公共构造方法。
所以,看看他们两个的文档,我认为不同的是getConstructors
只返回public
构造函数,而getDeclaredConstructors
返回所有的构造函数( public
, protected
,default(package)access和private
)
所以,如果只需要public
构造函数,然后使用getConstructors
。 否则,如果您需要所有构造函数(不考虑构造函数的访问修饰符),则使用getDeclaredConstructors
。
方法'getDeclaredConstructors'只返回在类中声明的构造函数。 getConstructors方法还返回在类中没有声明但是从超类inheritance的构造函数。
所以这取决于你要做什么。 没有正确的做法,这真的取决于你是否也需要超级构造函数。
getDeclaredXX()
方法的存在是为了通过这些类的创build者不一定想要的方式来操作类。 请注意,有一个getDeclaredMethod()
方法允许您调用私有方法, getDeclaredField()
方法允许您获取/设置私有字段。
我不完全确定“合法的”用例,但是这对于做某些事情显然是有用的。 而且,这个方法族只返回在类中专门声明的东西,而不是由于超类而存在于类中的东西。
访问一个私有的构造函数可能会出于同样的原因,我想。
我使用getDeclaredConstructors
来创build一个类的构造函数是私人的工厂,以避免我的系统的“用户”可以直接创build这些类而不使用工厂。 我觉得这个方法非常有用。