我注意到在Java反射API中有两种不同的方法来调用构造函数:getDeclaredConstructors
/getConstructors
方法。虽然Java文档略有不同(getDeclaredConstructors
似乎暗示它返回所有构造函数,而不是公共构造函数),但不清楚为什么API显式支持这两种不同的方法。
更重要的是,我想知道:如果我们动态调用类,什么时候一个方法比另一个方法更可取?例如,访问私有构造函数的目的是什么?
getDeclaredConstructors
(当您想要所有构造函数时)
返回一个构造函数对象数组,该数组反映由这个class对象表示的类声明的所有构造函数。它们是公共、受保护、默认(包)访问和私有构造函数。
getConstructors
(当您只希望 public
构造函数时)
返回一个包含构造函数对象的数组,该构造函数对象反映由这个class对象表示的类的所有公共构造函数。
所以,看看他们两个的文档,我认为不同之处在于getConstructors
只返回public
构造函数,而getDeclaredConstructors
返回所有构造函数(public
, protected
,默认(包)访问和private
)
因此,如果您只需要public
构造函数,那么使用getConstructors
就很容易了。否则,如果您需要所有构造函数(忽略构造函数的访问修饰符),则使用getDeclaredConstructors
。
getDeclaredXX()
方法的存在是为了以这些类的创建者不一定想要的方式操作这些类。请注意,getDeclaredMethod()
方法允许您调用私有方法,getDeclaredField()
方法允许您获取/设置私有字段。
我不完全确定"合法的"用例,但这些用例显然对做某些事情很有用。而且,这类方法只返回在类中明确声明的内容,而不是由于父类而存在于类中的内容。
访问私有构造函数可能也是出于同样的原因,我想
我使用getDeclaredConstructors
来创建一个类的工厂,其构造函数是私有的,以避免系统的"用户"可以直接创建这些类而不使用工厂。我发现这个方法很有用。
方法'getDeclaredConstructors'只返回在类中声明的构造函数。方法'getConstructors'也返回没有在类内部声明的构造函数,但继承自超类。
所以这取决于你要做什么。没有正确的方法,这实际上取决于你是否也需要超构造函数。