在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