2010-08-13 3 views
16

원시 클래스 객체를 객체 클래스 객체로 쉽게 변환 할 수 있습니까? 클래스 cl 클래스가 주어지면, 그것을 프리미티브가없는 클래스로 변환하려고합니다. 예 :Java : 원시 클래스 변환

Class<?> cl = int.class; 

... 
if (cl.isPrimitive()) { 
    cl = Object of primitive 
} 
... 

CL == Integer.class

내가 그 수행 방법을 원하는 모든 원시 유형. 분명히 모든 기본 유형을 반복 할 수 있지만 더 나은 해결책을 누군가가 알고 있다고 생각했습니다.

건배, 최대

+1

단지지도 상수를 만듭니다. 나는 8 가지 경우가 귀찮을 가치가 있다고 생각하지 않는다. –

+0

네 ... 네 말이 맞아. 어쨌든 이미 그렇게했습니다. 단지 저를 위해 그렇게하는 방법을 놓칠지도 모른다고 생각했습니다. – Max

답변

22

희망 나는 바로 그것을 이해했다. 기본적으로 기본 클래스 유형에서 래퍼 메소드로의 매핑이 필요합니다. , 또는

Class<?> wrapper = convertToWrapper(int.class); 

선언하고 정적지도 채울 :

public final static Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>>(); 
static { 
    map.put(boolean.class, Boolean.class); 
    map.put(byte.class, Byte.class); 
    map.put(short.class, Short.class); 
    map.put(char.class, Character.class); 
    map.put(int.class, Integer.class); 
    map.put(long.class, Long.class); 
    map.put(float.class, Float.class); 
    map.put(double.class, Double.class); 
} 

private Class<?> clazz = map.get(int.class); // usage 
+0

네, 그 일을 끝내는 방법이 꽤 있습니다. 고마워. – Max

+2

당신은 void.class를 잊어 버렸습니다. 그냥 말하자면 ' –

11
을이 같은 변환을 사용하기 때문에 약간의 유틸리티 클래스에서 구현

정적 유틸리티 메소드는, 우아 해결책이 될 것입니다

org.apache.commons.lang.ClassUtils.primitiveToWrapper (클래스)

6

Guava을 사용하는 경우 Primitives class, whi 채널이 같이 사용할 수 있습니다

Primitives.wrap(int.class); //returns Class<Integer> 
Primitives.wrap(Integer.class); //returns Class<Integer> 
0

이 모두 구아바와 아파치 코 몬즈 정말 필요하지 않지만을 할수있게 코드를 만드는 기본 HashMap<Class<?>, Class<?>>를 사용합니다.

다음 우버 최적화 니펫, 일정한 시간에 동일한 기능을 수행한다 :

골프 관련 코드가 약간 있으므로, 너);

+0

알고리즘의 작동 원리를 설명해 주시겠습니까? – luckydonald

+0

매우 제한된 색인 찾아보기를 수행하기 위해 실제 클래스 이름의 두 글자를 사용합니다. 동일한 알고리즘이 래퍼를 프리미티브로 변환하는 데에도 효과적 일뿐입니다. 유일한 차이점은 대신 문자 10과 12를 찾아야한다는 것입니다 (접두사 java.lang). 다음은 단위 테스트가있는 코드의 일부입니다. https://github.com/melezov/runtime-bytegen/blob/master/src/main/java/org/revenj/Primitives.java – melezov