2011-08-05 3 views
3

일부 속성에 대해 런타임에 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 인터페이스에서 제네릭의 사용 것으로 나타났습니다 몇 가지 테스트 후 ...

이 방법으로 선언하면 문제가 사라집니다. 더 이상 중복 된 방법이 없습니다.

답변

0

받는 방법에 대한 자세한 정보를 인쇄하십시오. 이름뿐 아니라 매개 변수 목록도 있습니다. 오버라이드 및 평균로드를 구분할 수있는 충분한 정보를 얻으십시오. 차이점은 이것에서 비롯 될 수 있지만 여전히 나에게는 분명하지 않습니다.

감사합니다, 스테판

+0

안녕 스테판를, 도움이되는 추가 정보는 어떤 종류의 것인가? – Guillaume

+0

오버로드에 대해 상속 된 매개 변수 유형을 비교하여 과부하에 대한 매개 변수 유형 목록입니다. – Snicolas

+0

나는 HasId가 제네릭을 사용하고 있다는 사실을 발견했다. 그러나 나는이 행동이 매우 이상하다는 것을 알게됩니다. – Guillaume