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

jay*_*100 56 java reflection constructor

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

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

Bhe*_*ung 60

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

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

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

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

所以,看的文档对他们俩的,我觉得不同的是,getConstructors仅返回public构造函数,而getDeclaredConstructors返回的所有构造函数(public,protected,默认(包)访问和private)

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

  • 通过使用constructor.setAccessible(true),您可以反射性地调用私有的构造函数. (7认同)

jli*_*jli 6

这些getDeclaredXX()方法用于以这些类的创建者不一定想要的方式操作类。请注意,有一种getDeclaredMethod()方法可以让您调用私有方法,还有getDeclaredField()一种方法可以让您获取/设置私有字段。

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

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