如何获取 Java Class 引用的初始化值
How to get the initialisation value for a Java Class reference
我有一个任意类型的 Class<?>
参考。如何获得该类型的初始化值?是否有一些库方法,或者我必须自己动手,例如:
Class<?> klass = ...
Object init =
(klass == boolean.class)
? false
: (klass == byte.class)
? (byte) 0
...
: (Object) null;
用例是我有一个任意的 java.lang.reflect.Method
引用,我想使用任意参数调用它(用于某些测试),如果参数是原始参数,则可能不是 null
类型,所以我需要指定该类型的一些值。
您可以使用 guava 库中的 Defaults
class:
public static void main(String[] args) {
System.out.println(Defaults.defaultValue(boolean.class));
System.out.println(Defaults.defaultValue(int.class));
System.out.println(Defaults.defaultValue(String.class));
}
打印:
false
0
null
要检查方法的参数是否为原始参数,请对参数类型调用 isPrimitive();
:
Method m = ...;
// to test the first parameter only:
m.getParameterTypes()[0].isPrimitive();
要在没有第 3 方库的情况下执行此操作,您可以创建一个长度为 1 的数组并读出它的第一个元素(这两个操作都通过 java.lang.reflect.Array
):
Object o = Array.get(Array.newInstance(klass, 1), 0);
从 Java9 开始,您还可以使用
Object o = MethodHandles.zero(klass).invoke();
为了完整起见,这是我认为属于反射的东西API,所以我将它添加到jOOR through #68
Object init = Reflect.initValue(klass);
值得注意的是, and there are
我有一个任意类型的 Class<?>
参考。如何获得该类型的初始化值?是否有一些库方法,或者我必须自己动手,例如:
Class<?> klass = ...
Object init =
(klass == boolean.class)
? false
: (klass == byte.class)
? (byte) 0
...
: (Object) null;
用例是我有一个任意的 java.lang.reflect.Method
引用,我想使用任意参数调用它(用于某些测试),如果参数是原始参数,则可能不是 null
类型,所以我需要指定该类型的一些值。
您可以使用 guava 库中的 Defaults
class:
public static void main(String[] args) {
System.out.println(Defaults.defaultValue(boolean.class));
System.out.println(Defaults.defaultValue(int.class));
System.out.println(Defaults.defaultValue(String.class));
}
打印:
false
0
null
要检查方法的参数是否为原始参数,请对参数类型调用 isPrimitive();
:
Method m = ...;
// to test the first parameter only:
m.getParameterTypes()[0].isPrimitive();
要在没有第 3 方库的情况下执行此操作,您可以创建一个长度为 1 的数组并读出它的第一个元素(这两个操作都通过 java.lang.reflect.Array
):
Object o = Array.get(Array.newInstance(klass, 1), 0);
从 Java9 开始,您还可以使用
Object o = MethodHandles.zero(klass).invoke();
为了完整起见,这是我认为属于反射的东西API,所以我将它添加到jOOR through #68
Object init = Reflect.initValue(klass);
值得注意的是,