如何判断原始类型是否被转换为Java中的对象?

时间:2017-10-14 18:09:47

标签: java reflection casting overloading primitive

在Java中,请考虑以下代码:

int myPrimitiveInt = 5;
Integer myObjectInt = 4;

Object fromPrimitive = myPrimitiveInt;
Object fromObject = myObjectInt;

System.out.println(fromPrimitive.getClass());
System.out.println(fromObject.getClass());
System.out.println(int.class);

输出:

class java.lang.Integer
class java.lang.Integer
int

我想要的是获取第一个int的输出println的方法。

为什么?,你会问。嗯,首先,我想知道这样的事情是否可能。

但其背后的实际原因是一个抽象层,用于通过反射测试具有基本类型参​​数的私有方法。最小代码:

package testing;

import java.lang.reflect.Method;

public class Testing {
    private static void doStuff(int a) {
        System.out.println("primitive: " + ((Object) a).getClass());
    }

    public static void main(String[] args) throws ReflectiveOperationException {
        Reflect.reflect(Testing.class, "doStuff", 10);
    }
}

abstract class Reflect {
    static Object reflect(Class<?> clazz, String methodName, Object arg) throws ReflectiveOperationException {
        Method method = clazz.getDeclaredMethod(methodName, arg.getClass());
        method.setAccessible(true);
        return method.invoke(null, arg);
    }
}

输出:

Exception in thread "main" java.lang.NoSuchMethodException: testing.Testing.doStuff(java.lang.Integer)
at java.lang.Class.getDeclaredMethod(Class.java:2130)
at testing.Reflect.reflect(Testing.java:17)
at testing.Testing.main(Testing.java:11)

预期产出:

primitive: class java.lang.Integer

甚至更好(如果可能的话):

primitive: int

注意:我知道我可以clazz.getDeclaredMethod(methodName, int.class)。这篇文章的重点是使这个过程更抽象。请不要给我答案,建议将参数 types 传递给reflect方法!

2 个答案:

答案 0 :(得分:4)

撰写Object x = 10

时会发生什么

intautoboxed,使其成为价值为10的Integer

为什么之后无法检测到

因为Integer与自动装箱的值10和另一个值为10的整数没有区别

我如何解决这个问题

您需要为原始值添加单独的方法来重载,这些方法可以处理原始值,因此它们不会被自动装箱。

答案 1 :(得分:2)

原始类型永远不会“强制转换”为对象。

原语可以“自动装入”对象,但是你永远无法在代码中确定这一点,因为自动装箱只是编译器添加的代码,与你手工添加的代码无法区分。 / p>