为什么我们首先需要isPrimitive()?

Hea*_*ren 3 java primitive-types java-8

抱歉,这个不清楚的问题,但是我真的迷失了为什么我们isPrimitive()首先需要它,因为我不能使用它(对不起,我只是在需要时才不能使用它;(可悲的是在这里)。

在到处阅读文章后,我发现一些用法

int.class.isPrimitive()
Run Code Online (Sandbox Code Playgroud)

但我想吃点东西

boolean isTrue = true;
System.out.println(isTrue.class.isPrimitive());
System.out.println(Boolean.valueOf(isTrue).getClass().isPrimitive());
Run Code Online (Sandbox Code Playgroud)

我试图遍历对象的字段时检查类型;我现在能做的是

private static boolean isPrimitiveWrapper(Object obj) {
    return obj.getClass() == Boolean.class ||
            obj.getClass() == Byte.class ||
            obj.getClass() == Character.class ||
            obj.getClass() == Short.class ||
            obj.getClass() == Integer.class ||
            obj.getClass() == Long.class ||
            obj.getClass() == Float.class ||
            obj.getClass() == Double.class;
}
Run Code Online (Sandbox Code Playgroud)

但是在检查之后,我认为应该有问题,但是我不知道这是什么。

任何用例将不胜感激;)

我正在尝试不要太偏执...已经很努力了

Joo*_*gen 9

由于在某些情况下不能将原始类型作为对象(例如数组)处理,因此最好将其作为第一个鉴别器。

Object cloneObject(Object obj) {
    Class<?> type = obj == null ? Object.class : obj.getClass();
    if (type.isArray()) {
        Class<?> elemType = type.getComponentType();
        if (!elemType.isPrimitive()) {
            Object[] copy = ...
        } else {
            // Must distinguish between int/double/boolean/...
            ... int[] ... double[] ...
        }
    }

Object inta = new int[] { 2, 3, 5, 7 };
int[] pr = (int[]) cloneObject(inta);
Run Code Online (Sandbox Code Playgroud)

  • @JoopEggen在[此问与答](/sf/ask/3709192091/)上提醒我,例如,MethodHandles.zero(primitiveType).invoke()。getClass()可以。但是,当然,这不是人们能想到的最简单的API… (4认同)
  • 实际上,反射API缺少的是获取原始类的包装器Object类,有点像上面的内容。或者您自己序列化为字节。 (2认同)