2013-05-27 14 views
5

Czy istnieje sposób, aby wiedzieć, czy dana klasa to klasa skrzynie typu pierwotnego czy też muszę zrobić brzydki sposób tak:Detect klasę boks

public boolean isBoxingClass(Class clazz){ 
    String simpleName=clazz.getSimpleName(); 
    switch(simpleName){ 
    case "Integer": 
    case "Long": 
    case "Boolean": 
    case "Double": 
    case "Float": 
     return true; 
    default : 
     return false; 
    } 
} 

EDIT:

Jeśli w końcu zdecydowaliśmy się na to rozwiązanie:

public static final List<Class> BOXING_CLASSES= Arrays.asList(new Class[]{ 
     Integer.class, 
     Long.class, 
     Short.class, 
     Boolean.class, 
     Double.class, 
     Float.class, 
     Character.class, 
     Void.class, 
     Byte.class}); 

public static boolean isBoxing(Class clazz){ 
    return BOXING_CLASSES.contains(clazz); 
} 
+1

Co z 'charakterem'? –

+6

To by zwróciło 'true' dla' my.package.Integer'! Lepiej zrobić to w ten sposób: 'class == Integer.class || class == Long.class || ... '(lub odpowiednik,' Set > 'przydałby się). –

+1

@Ziyao Wei: Potrzebuję metody właśnie dlatego, że nie chcę przegapić niektórych takich przypadków;) –

Odpowiedz

-1

Jak o poszukiwaniu jeśli klasa implementuje numer, lub jeśli jest to postaci, lub Boolean (myślę, że są to jedyne opcje)?

public boolean isBoxingClass(Class clazz) 
{ 
    return Number.class.isAssignableFrom(clazz) || 
      Character.class.isAssignableFrom(clazz) || 
      Boolean.class.isAssignableFrom(clazz); 
} 

W tym przypadku masz pewność, że np. BigDecimal i AtomicInteger również nie są pewni, czy tego właśnie chcesz. Ale w żadnym wypadku nie musisz przechodzić przez getSimpleName().

+0

Zwraca "true" dla "BigDecimal.class". –

2

To najprostszy sposób, jaki mogłem wymyślić. Klasy opakowania są dostępne tylko w pakiecie java.lang. Oprócz klas opakowania, żadna inna klasa w java.lang nie ma zmiennej o nazwie TYPE. Możesz go użyć do sprawdzenia, czy klasa jest klasą Wrapper, czy nie.

public static boolean isBoxingClass(Class<?> clazz) 
{ 
    String pack = clazz.getPackage().getName(); 
    if(!"java.lang".equals(pack)) 
     return false; 
    try 
    { 
     clazz.getField("TYPE"); 
    } 
    catch (NoSuchFieldException e) 
    { 
     return false; 
    }   
    return true;   
}