일부 속성에 대해 런타임에 JPA 주석을 가져 오려고 할 때이 문제가 발생했습니다. 나는 이유를 설명 할 수 없다.BeanInfo : methodDescriptors와 class : declaredMethods의 차이점 : 동일한 이름 및 메서드 마스킹을 사용하는 여러 메서드
추신 : 봄과 디버깅 세션을 마친 후에 컴파일러에서 컴파일 타임에 도입 된이 문제에 대한 설명을 발견했습니다. 이 질문에 대한 내 대답을 참조하십시오.
다음은이 문제를 복제 한 샘플 소스 코드입니다 (실제 코드의 단순화 된 버전).
import java.beans.BeanInfo; 가져 오기 java.beans.IntrospectionException; 가져 오기 java.beans.Introspector; 가져 오기 java.beans.MethodDescriptor; import java.io.Serializable; import java.lang.reflect.Method;
공용 클래스 MethodMasking {
public interface HasId<ID extends Serializable> {
void setId(ID id);
ID getId();
}
public interface Storeable extends HasId<Long> {}
class Item implements Storeable {Long id; String code;
Item(Long id, String code) { this.id = id; this.code = code; }
public Long getId() { return id; }
public void setId(Long id) {this.id = id;}
}
public static void main(String[] args) throws IntrospectionException {
final BeanInfo beanInfo = Introspector.getBeanInfo(Item.class);
java.lang.System.out.println("BeanInfo:methodDescriptors:");
final MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
for (MethodDescriptor methodDescriptor : methodDescriptors) {
java.lang.System.out.println("\t"+methodDescriptor.getMethod().getName());
}
java.lang.System.out.println("class:declaredMethods:");
final Method[] declaredMethods = Item.class.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
java.lang.System.out.println("\t"+declaredMethod.getName());
}
}
} 프로그램의 출력 :
BeanInfo:methodDescriptors:
hashCode
wait
getId
notifyAll
equals
wait
wait
toString
setId
notify
setId
getClass
class:declaredMethods:
getId
getId
setId
setId
이 지금은 혼란 스러워요 :
이유의 BeanInfo 2 메소드 setId에 대한 설명 만 하나있다 getId를 위해서?
선언 된 메소드에는 getId에 2 개의 메소드가 있고 setId에 2 개의 메소드가있는 이유는 무엇입니까? 디버깅하는 동안 getDeclaredMethods를 사용하는 경우
나는이 방법 서명이 있습니다
[0] = {[email protected]}"public java.lang.Long MethodMasking$Item.getId()"
[1] = {[email protected]}"public java.io.Serializable MethodMasking$Item.getId()"
[2] = {[email protected]}"public void MethodMasking$Item.setId(java.lang.Long)"
[3] = {[email protected]}"public void MethodMasking$Item.setId(java.io.Serializable)"
편집 : 문제의 원인이 HasId 인터페이스에서 제네릭의 사용 것으로 나타났습니다 몇 가지 테스트 후 ...
이 방법으로 선언하면 문제가 사라집니다. 더 이상 중복 된 방법이 없습니다.
안녕 스테판를, 도움이되는 추가 정보는 어떤 종류의 것인가? – Guillaume
오버로드에 대해 상속 된 매개 변수 유형을 비교하여 과부하에 대한 매개 변수 유형 목록입니다. – Snicolas
나는 HasId가 제네릭을 사용하고 있다는 사실을 발견했다. 그러나 나는이 행동이 매우 이상하다는 것을 알게됩니다. – Guillaume