IT Share you

클래스 API에서 getDeclaredConstructors와 getConstructors의 차이점은 무엇입니까?

shareyou 2021. 1. 8. 21:45
반응형

클래스 API에서 getDeclaredConstructors와 getConstructors의 차이점은 무엇입니까?


Java Reflection API에는 생성자를 호출하는 두 가지 다른 메서드 인 getDeclaredConstructors/ getConstructors메서드가 있습니다. Java 문서가 약간 다르지만 ( getDeclaredConstructors공개 생성자가 아닌 모든 생성자를 반환하는 것으로 암시 됨) API가이 두 가지 다른 메서드를 명시 적으로 지원하는 이유는 명확하지 않습니다.

더 중요한 것은 궁금합니다. 클래스를 동적으로 호출하는 경우 언제 한 메서드가 다른 메서드보다 더 좋을까요? 예를 들어 개인 생성자에 액세스하는 목적은 무엇입니까?


getDeclaredConstructors( 모든 생성자 를 원할 때 )

이 Class 객체가 나타내는 클래스가 선언 한 모든 생성자를 반영하는 Constructor 객체의 배열을 리턴합니다. 이들은 공개, 보호, 기본 (패키지) 액세스 및 개인 생성자입니다.

getConstructors( 생성자 public 원하는 경우 )

이 Class 객체가 나타내는 클래스의 모든 공용 생성자를 반영하는 Constructor 객체를 포함하는 배열을 리턴합니다.

그래서, 그 모두에 대한 문서보고, 나는 차이가 생각 getConstructors만 반환 public생성자 동안 getDeclaredConstructors반환 모든 생성자 ( public, protected, 디폴트 (package) 액세스, 및 private)

따라서 public생성자 만 필요한 경우 getConstructors. 그렇지 않고 모든 생성자가 필요한 경우 (생성자의 액세스 수정 자에 관계없이) getDeclaredConstructors.


getDeclaredXX()방법은 반드시 해당 클래스의 제작자가 의도하지 않은 방법으로 클래스의 조작을 위해 존재한다. getDeclaredMethod()개인 메서드를 호출 할 수 있는 메서드와 getDeclaredField()개인 필드를 가져 오거나 설정할 수있는 메서드가 있습니다.

"합법적 인"사용 사례에 대해 완전히 확신 할 수는 없지만 특정 작업을 수행하는 데는 분명히 유용합니다. 또한이 메서드 패밀리는 클래스에서 특별히 선언 된 것만 반환하고 수퍼 클래스로 인해 클래스에 존재하는 것은 반환하지 않습니다.

개인 생성자에 액세스하는 것도 같은 이유로 유용 할 수 있습니다.


'getDeclaredConstructors'메서드는 클래스 내부에 선언 된 생성자 만 반환합니다. 'getConstructors'메소드는 클래스 내에서 선언되지 않았지만 슈퍼 클래스에서 상속 된 생성자를 반환합니다.

그래서 그것은 당신이 무엇을 할 것인지에 달려 있습니다. 올바른 접근 방식은 없으며 슈퍼 생성자가 필요한지 여부에 따라 다릅니다.


내가 사용하는 getDeclaredConstructors직접 공장을 사용하지 않고 생성자 내 시스템의 "사용자가"이러한 클래스를 만들 수 있다는 것을 피하기 위해 비공개 클래스의 공장을 만들 수 있습니다. 이 방법은 매우 유용합니다.

참조 URL : https://stackoverflow.com/questions/8249173/what-is-the-difference-between-getdeclaredconstructors-and-getconstructors-in-th

반응형