2012-06-01 2 views
2

나는 getter 및 setter있는 클래스가 사용 아파치 코 몬즈 PropertyUtils는 :BeanUtils는

PropertyUtils.getProperty(myAInstance, "offers.size"); 

이 기본적으로 수행해야합니다 같은 :

myAInstance.getOffers().size(); 

그러나 PropertyUti를 사용하여 LS가 작동하고 나에게 제공하지 않습니다

java.lang.NoSuchMethodException : 클래스 알 수없는 특성 '크기'모든 게터에 '클래스를 java.util.LinkedHashSet'

사용 PropertyUtils 및 다른 개체에 setters 잘 작동합니다.

콜렉션의 size() 메소드가 getXXX 및 setXXX 빈 규칙을 따르지 않기 때문인 것으로 생각됩니다.

PropertyUtils/또는 BeanUtils (또는 Apache Commons의 다른 항목)를 사용하여 내 모음의 size() 메소드를 호출하는 다른 방법이 있습니까?

감사 크리스토프

답변

3

이유는 PropertyUtils의 이름이 "PropertyUtils"입니다. 그것은 자바 콩 규칙에 작동합니다. "size()"메서드는 해당 규칙을 따르지 않으므로이를 속성으로 참조 할 수 없습니다.

MVEL 또는 GroovyScript와 같은 기능을 사용하면 속성 탐색과 함수 호출을 모두 지원할 수 있습니다. 다음은 작동 할 mvel을위한 샘플입니다.

Integer size = (Integer) MVEL.eval("offers.size()", instanceOfA); 

시도해보십시오.

+0

예, 저는 MVEL이 아파치 공유지가 아니라 아파치 2.0 라이센스를 사용하고 있다는 것을 알고 있습니다. 이것은 정확히 모든 공용 패키지가 사용해야한다고 생각합니다. – Matt

+0

감사합니다. 표현 언어가 내가 찾고있는 언어라는 것을 알고, PropertyUtils의 잘못된 것을 예상했습니다. MVEL을 사용해 보겠습니다. – Christoph

0

완전히 명확하지 당신이 반사 API 주위에 약간의 얇은 래퍼를 제공는 않지만 싶어하는 이유.

MethodUtils class, 특히 invokeExactMethod 또는 invokeMethod variants 중 하나를 사용하고 싶습니다.

+0

흠 MethodUtils와 invokeMethod 변형은 메서드의 중첩 된 정의를 지원하지 않습니다. 나는 invokeMethod ("offers.size")를 말할 수 있기를 원하며, 인자없이 두 개의 메소드 getOffers(). getSize()를 호출하고자한다. 그러나이 또한 나에게 : 접근 할 수있는 메소드가 없다 : 객체에 offer.size()가있다. – Christoph

+0

@Christoph OGNL (현재는 Apache 프로젝트)과 JSP EL 등을 제외하고는 표현 언어가 아니며, 커먼즈의 모든 것. 사소한 유틸리티 방법으로 빈 utils와 속성 utils를 결합하는 것은 정말로 어렵습니까? 또는 스크립팅과 같은 다른 접근 방식을 취해야합니다. –

+0

감사합니다. Dave. 그것을 보는 "표현 언어"방법은 의미가 있습니다. 흠, 처음에는 D3mon-1stVFW의 해결 방법을 살펴보고 Matt이 언급 한 MVEL을 사용해 보겠습니다. 나는 MVEL이 내가 찾고있는 것 이상이라고 생각한다. Property/BeanUtils의 조합에 관해서는 : 너무 어렵지 않습니다. (이미 해킹했습니다 ...)하지만이 기능은 이미 제공되었지만 어쩌면 그걸 찾지 못했을 것이라고 생각했습니다. :) Thanks – Christoph

1

주위에 방법 (이 동작하지 않습니다 수) + 당신의 클래스에이 추가

를 '당신이 싶어 이유를 완전히 명확하지'나는 데이브에 동의

public int getOfferSize(){ 
    return offers == null ? 0 : offers.size(); 
} 

그런 다음 사용하십시오

PropertyUtils.getProperty(myAInstance, "offerSize"); 
+0

+1; 사소한 해결 방법, Demeter는 황홀 할 것입니다. –

0

라이브러리를 사용하지 않고 좋은 이전 리플렉션을 통해 직접 수행 할 수 있습니다.

Method get = A.class.getDeclaredMethod("getOffers"); 

지금 당신이 게터를 호출 세트를 나타내는 객체를 취득 할 :

첫째, 당신은 게터를 얻을.그런 다음 설정에 정의 된 크기의 방법을 표현하는 새로운 방법 작성 : 마지막으로

Object setFromA= get.invoke(yourAObject); 
Method size = Set.class.getDeclaredMethod("size"); 

을, 당신은 setFromA의 방법을 주조하고 필요한 유형에 setFromA 개체를 캐스팅, 크기를 얻을 :

Integer listSize = (Integer) size.invoke(get.getReturnType().cast(setFromA)); 
+0

그렇습니다. 지금 해킹 한 방법입니다.하지만 90 %가 getters/setter이므로 PropertyUtils의 중첩 된 속성 구문이 마음에 들었습니다. 나는 getters/setters에 충실하거나 MVEL과 같은 표현 언어를 시도 할 것이다. – Christoph