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

在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

我想要的是一种方法来获得第一个println的输出int.

为什么?,你会问.好吧,首先,我想知道这样的事情是否可行.

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

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).这篇文章的重点是使这个过程更抽象.请不要给我答案,建议将参数类型传递给reflect方法!

解决方法:

写对象x = 10时会发生什么

int是autoboxed,使其成为值为10的Integer.

之后为什么不能检测到这一点

因为具有自动装箱的值10的整数与具有值10的另一个整数之间没有区别

我怎么能解决这个问题呢

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

标签:java,reflection,casting,overloading,primitive

来源: https://codeday.me/bug/20190823/1698775.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值