2010-12-09 4 views
8

저는 파이썬 코드를 자바로 변환하고 있으며 객체의 메소드를 호출해야하지만 런타임까지는 어떤 메소드를 모르는 상황이 있습니다. 파이썬에서는 getattr을 내 객체에 사용하고 내 메소드의 이름 인 문자열을 전달하여이 문제를 해결합니다. 자바에서 비슷한 것을 어떻게 할 것입니까?python의 getattr에 해당하는 Java?

답변

11

Class.getField은 (는) 친구입니다. 파이썬이 동적으로 타입이 지정되고 자바가 정적으로 타입이 지정 되었기 때문에 (필드의 타입을 미리 알지 못한다면) 그리 쉽지는 않을 것입니다.

편집 :이 예제를 번역하는 방법. http://effbot.org/zone/python-getattr.htm

속성 조회

파이썬

//normal 
value = obj.attribute 

//runtime 
value = getattr(obj, "attribute") 

자바

//normal 
value = obj.attribute; 

//runtime 
value = obj.getClass().getField("attribute").get(obj); 


메소드 호출

파이썬은

//normal 
result = obj.method(args) 

//runtime 
func = getattr(obj, "method") 
result = func(args) 

자바 간단한 경우

//normal 
result = obj.method(args); 

//runtime 
Method func = obj.getClass().getMethod("method", Object[].class); 
result = func.invoke(obj, args); 

, 당신은 당신이 필드 또는 방법이 있는지 알고 있어야합니다. 그들은 같은 이름을 가질 수 있습니다. 또한 메서드가 오버로드 될 수 있으므로 원하는 메서드 서명을 알아야합니다.

당신이 얻는 방법이나 필드를 신경 쓰지 않는다면 이것을 쉽게 도우미 메서드로 구현할 수 있습니다.

+0

Field.get()은 모든 데이터 유형의 Object를 반환합니다. 그것은 정적으로 점검되지 않았습니다. –

+1

@Peter :'getattr'와 동일합니다. Python 개발자는 알 수없는 것을 두려워하지 않습니다. –

+0

@Peter 요점은 무엇인지 모르겠습니다. 파이썬에서는'getattr (obj, field ") * 2'을 할 수 있으며 int, float, strings, lists 등에서 작동합니다. – NPE

0

Java Reflection에 대해 알아 보려면 here을 시작할 수 있습니다.

0

자바에서는 Reflection API를 사용하여이 작업을 수행합니다 (일반적으로 꽤 복잡합니다).

MethodUtils 아파치 코 몬즈 BeanUtils 프로젝트에서는 약간의 작업이 더 쉬울 수도 있지만, 이와 같은 간단한 일에 상당히 의존적입니다.

관련 문제