Определение, является ли Объект примитивного типа - PullRequest
99 голосов
/ 02 апреля 2009

У меня есть массив Object[], и я пытаюсь найти те, которые являются примитивами. Я пытался использовать Class.isPrimitive(), но кажется, что я делаю что-то не так:

int i = 3;
Object o = i;

System.out.println(o.getClass().getName() + ", " +
                   o.getClass().isPrimitive());

отпечатков java.lang.Integer, false.

Есть ли верный путь или какая-то альтернатива?

Ответы [ 17 ]

2 голосов
/ 31 декабря 2015

Я опаздываю на шоу, но если вы тестируете поле, вы можете использовать getGenericType:

import static org.junit.Assert.*;

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;

import org.junit.Test;

public class PrimitiveVsObjectTest {

    private static final Collection<String> PRIMITIVE_TYPES = 
            new HashSet<>(Arrays.asList("byte", "short", "int", "long", "float", "double", "boolean", "char"));

    private static boolean isPrimitive(Type type) {
        return PRIMITIVE_TYPES.contains(type.getTypeName());
    }

    public int i1 = 34;
    public Integer i2 = 34;

    @Test
    public void primitive_type() throws NoSuchFieldException, SecurityException {
        Field i1Field = PrimitiveVsObjectTest.class.getField("i1");
        Type genericType1 = i1Field.getGenericType();
        assertEquals("int", genericType1.getTypeName());
        assertNotEquals("java.lang.Integer", genericType1.getTypeName());
        assertTrue(isPrimitive(genericType1));
    }

    @Test
    public void object_type() throws NoSuchFieldException, SecurityException {
        Field i2Field = PrimitiveVsObjectTest.class.getField("i2");
        Type genericType2 = i2Field.getGenericType();
        assertEquals("java.lang.Integer", genericType2.getTypeName());
        assertNotEquals("int", genericType2.getTypeName());
        assertFalse(isPrimitive(genericType2));
    }
}

В документации Oracle перечислены 8 типов примитивов.

2 голосов
/ 02 апреля 2009

Примитивные типы-оболочки не будут отвечать на это значение. Это для классового представления примитивов, хотя, кроме размышлений, я не могу придумать слишком много вариантов его использования. Так, например

System.out.println(Integer.class.isPrimitive());

печатает "ложь", но

public static void main (String args[]) throws Exception
{
    Method m = Junk.class.getMethod( "a",null);
    System.out.println( m.getReturnType().isPrimitive());
}

public static int a()
{
    return 1;
}

печатает "правда"

2 голосов
/ 02 апреля 2009

Как уже говорили несколько человек, это связано с autoboxing .

Вы могли бы создать служебный метод, чтобы проверить, является ли класс объекта Integer, Double и т. Д. Но не существует способа узнать, был ли объект создан путем автобоксирования примитивный ; когда он упакован, он выглядит как объект, созданный явно.

Так что, если вы точно не знаете, что ваш массив никогда не будет содержать класс-оболочку без автобокса, реального решения не существует.

1 голос
/ 17 августа 2016

вы можете определить, является ли объект типом оболочки, с помощью следующих операторов:

***objClass.isAssignableFrom(Number.class);***

и вы также можете определить примитивный объект с помощью метода isPrimitive ()

1 голос
/ 27 мая 2013

Это самый простой способ, который я мог придумать. Классы-обертки присутствуют только в пакете java.lang. И кроме классов-оболочек, ни один другой класс в java.lang не имеет поля с именем TYPE. Вы можете использовать это, чтобы проверить, является ли класс классом Wrapper или нет.

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;        
}
1 голос
/ 30 сентября 2010

Получите BeanUtils из Spring http://static.springsource.org/spring/docs/3.0.x/javadoc-api/

Вероятно, вариант Apache (commons beans) имеет аналогичную функциональность.

0 голосов
/ 01 октября 2012
public class CheckPrimitve {
    public static void main(String[] args) {
        int i = 3;
        Object o = i;
        System.out.println(o.getClass().getSimpleName().equals("Integer"));
        Field[] fields = o.getClass().getFields();
        for(Field field:fields) {
            System.out.println(field.getType());
        }
    }
}  

Output:
true
int
int
class java.lang.Class
int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...