如何判断原始类型是否被转换为 Java 中的对象?
How to tell if a primitive type was cast into an object in 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)
。这个 post 的全部意义在于使这个过程更加抽象。请不要给我建议将参数 types 传递给 reflect
方法的答案!
当你写 Object x = 10
时会发生什么
int
是 autoboxed,这使得它成为一个 Integer
,值为 10。
为什么事后检测不到这个
因为自动装箱的值为 10 的整数与另一个值为 10 的整数没有区别
我该如何解决这个问题
您需要添加单独的方法来重载原始值,这些方法可以处理原始值,因此它们不会被自动装箱。
基本类型永远不会 "cast" 对象。
基元可能 "autoboxed" 到对象中,但您永远无法在代码中确定这一点,因为自动装箱只是编译器添加的代码,与您可能添加的相同代码无法区分手动。
在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)
。这个 post 的全部意义在于使这个过程更加抽象。请不要给我建议将参数 types 传递给 reflect
方法的答案!
当你写 Object x = 10
时会发生什么
int
是 autoboxed,这使得它成为一个 Integer
,值为 10。
为什么事后检测不到这个
因为自动装箱的值为 10 的整数与另一个值为 10 的整数没有区别
我该如何解决这个问题
您需要添加单独的方法来重载原始值,这些方法可以处理原始值,因此它们不会被自动装箱。
基本类型永远不会 "cast" 对象。
基元可能 "autoboxed" 到对象中,但您永远无法在代码中确定这一点,因为自动装箱只是编译器添加的代码,与您可能添加的相同代码无法区分手动。