getConstructor가 Java에서 NoSuchMethodException을 발생시킵니다.
Oct 15 2020
저는 Java를 처음 접했기 때문에 어리석은 질문 일 수 있지만 기존 인스턴스에서 클래스를 가져 와서 클래스의 새 인스턴스를 만드는 방법을 이해하려고합니다 (나는 이것을 리플렉션이라고 생각합니다).
현재 나는 수퍼 클래스와 그 하위 클래스가 있습니다.
public abstract class SuperClazz {...}
public class SubClazz1 extends SuperClazz {...}
public class SubClazz2 extends SuperClazz {...}
이 하위 클래스 중 하나의 기존 인스턴스가 있습니다 (아직 어떤 하위 클래스에 속할지 모르기 때문에 수퍼 클래스의 구성원으로 만 선언 됨). 이 기존 인스턴스가 속한 하위 클래스를 가져와 동일한 하위 클래스의 새 인스턴스를 만들려고합니다.
이것은 내 설정입니다.
private SuperClazz oldSubInstance;
private SuperClazz newSubInstance;
newSubInstance = oldSubInstance.getClass().getConstructor(String.class, char.class, int.class).newInstance("abc", 'e', 6);
NoSuchMethodException이 발생합니다.
SuperClazz에 String, char 및 int의 세 가지 매개 변수를 사용하는 생성자가 있다는 것을 알고 있기 때문에 혼란 스럽습니다. 여기 와 여기에서 답변을 보았지만 제안 된 수정 사항을 구현하는 것이 작동하지 않거나 해당 문제가 내 상황에 적용되지 않는 것으로 나타났습니다.
getConstructor가 어떻게 작동하는지 완전히 오해하고 있습니까?
답변
AlexRudenko Oct 15 2020 at 20:04
all-args 생성자가 자식 클래스에 있는지 확인해야합니다.
다음 예제는 다음을 생성합니다 newSubInstance.
// using Lombok annotations for brevity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
abstract class SuperClazz {
private String str;
private char chr;
private int x;
// getters/setters/default and all-args constructors provided by Lombok
}
class SubClazz1 extends SuperClazz {
public SubClazz1(String str, char c, int i) { // providing constructor in the child class
super(str, c, i);
}
}
// test
SuperClazz oldSubInstance = new SubClazz1("def", 'g', 10);
SuperClazz newSubInstance;
newSubInstance = oldSubInstance.getClass()
.getConstructor(String.class, char.class, int.class)
.newInstance("abc", 'e', 6);
System.out.println(newSubInstance);
출력 ( toString기본 클래스 수준에서 재정의 됨) :
SuperClazz(str=abc, chr=e, x=6)