rip*_*234 49 java reflection guava
我手边有一个Java原始类型:
Class<?> c = int.class; // or long.class, or boolean.class
Run Code Online (Sandbox Code Playgroud)
我想获得此类的默认值 - 具体而言,如果未初始化该值,则将该值分配给此类型的字段.例如,0对于数字,false对于布尔值.
有没有通用的方法来做到这一点?我试过这个:
c.newInstance()
Run Code Online (Sandbox Code Playgroud)
但我得到的是一个InstantiationException,而不是一个默认的实例.
whi*_*rra 53
Guava Libraries已经包含:http:
//guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Defaults.html
调用defaultValue将返回任何基本类型的默认值(由JLS指定),并为任何其他类型返回null.
像这样使用它:
import com.google.common.base.Defaults;
Defaults.defaultValue(Integer.TYPE); //will return 0
Run Code Online (Sandbox Code Playgroud)
Ant*_*g99 18
通过创建一个元素的数组并检索其第一个值,可以获得任何类型的默认值.
private static <T> T getDefaultValue(Class<T> clazz) {
return (T) Array.get(Array.newInstance(clazz, 1), 0);
}
Run Code Online (Sandbox Code Playgroud)
这种方式不需要考虑每种可能的原始类型,创建单元素阵列的成本通常可以忽略不计.
Jac*_*eow 11
这就是我的想法(虽然没有通过优雅测试):
public class PrimitiveDefaults {
// These gets initialized to their default values
private static boolean DEFAULT_BOOLEAN;
private static byte DEFAULT_BYTE;
private static short DEFAULT_SHORT;
private static int DEFAULT_INT;
private static long DEFAULT_LONG;
private static float DEFAULT_FLOAT;
private static double DEFAULT_DOUBLE;
public static Object getDefaultValue(Class clazz) {
if (clazz.equals(boolean.class)) {
return DEFAULT_BOOLEAN;
} else if (clazz.equals(byte.class)) {
return DEFAULT_BYTE;
} else if (clazz.equals(short.class)) {
return DEFAULT_SHORT;
} else if (clazz.equals(int.class)) {
return DEFAULT_INT;
} else if (clazz.equals(long.class)) {
return DEFAULT_LONG;
} else if (clazz.equals(float.class)) {
return DEFAULT_FLOAT;
} else if (clazz.equals(double.class)) {
return DEFAULT_DOUBLE;
} else {
throw new IllegalArgumentException(
"Class type " + clazz + " not supported");
}
}
}
Run Code Online (Sandbox Code Playgroud)
Guava的替代品Defaults.java,它允许实现找出默认值(通过使用Antag99的答案改进):
import static java.util.stream.Collectors.toMap;
import java.lang.reflect.Array;
import java.util.Map;
import java.util.stream.Stream;
public class DefaultValue {
/**
* @param clazz
* the class for which a default value is needed
* @return A reasonable default value for the given class (the boxed default
* value for primitives, <code>null</code> otherwise).
*/
@SuppressWarnings("unchecked")
public static <T> T forClass(Class<T> clazz) {
return (T) DEFAULT_VALUES.get(clazz);
}
private static final Map<Class<?>, Object> DEFAULT_VALUES = Stream
.of(boolean.class, byte.class, char.class, double.class, float.class, int.class, long.class, short.class)
.collect(toMap(clazz -> (Class<?>) clazz, clazz -> Array.get(Array.newInstance(clazz, 1), 0)));
public static void main(String... args) {
System.out.println(DefaultValue.forClass(int.class)); // 0
System.out.println(DefaultValue.forClass(Integer.class)); // null
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32854 次 |
| 最近记录: |