我有一个类(带有超类)我要检查所有字段是否为NULL,或者它是否为Collection,它是空的。使用以下代码,我可以检查NULL以及它是否为Collection,但我似乎无法强制使用Collection来检查它的大小:
enable-time-statistics=true
statistic-sampling-enabled=true
...
但是这会导致java.lang.ClassCastException:无法将java.lang.reflect.Field强制转换为java.util.Collection
如何获取列表的大小?
答案 0 :(得分:4)
您无法将字段转换为集合。您可以将字段对象强制转换为集合。试试这个:
System.err.println(Collection.class.cast(field.get(object)).size());
答案 1 :(得分:0)
下面的代码将使用java反射将空白空字符串转换为null:
package reflection;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Sachin Rane on 7/1/21
*/
public class ReflectionUtils {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("Sachin");
employee.setCity("");//this will set to null
replaceAllEmptyStringFieldsWithNull(employee);
if (null == employee.getCity()) {
System.out.println("replaceAllEmptyStringFieldsWithNull converted blank string to null");
}
}
public static void replaceAllEmptyStringFieldsWithNull(Object object) {
if (null == object) {
return;
}
Method[] methodsOfObject = object.getClass().getDeclaredMethods();
Method methodRef = null;
try {
for (Method method : methodsOfObject) {
methodRef = method;
method.setAccessible(true);
if (isGetType(method)) {
//skip list, set, map or array objects
if (skipObjectsCheck(method)) {
continue;
}
if (method.getReturnType() == String.class) {
String value = (String) method.invoke(object);
if ("".equals(value)) {
Field field = getFieldByFieldName(object, method.getName().replace("get", ""));
if (null != field) {
field.setAccessible(true);
field.set(object, null);
}
}
} else {
replaceAllEmptyStringFieldsWithNull(method.invoke(object));
}
}
}
} catch (IllegalAccessException ex) {
System.out.println("IllegalAccessException while invoking method for class : " + object.getClass().getName()
+ " and method : " + (null != methodRef ? methodRef.getName() : null));
} catch (InvocationTargetException ex) {
System.out.println("InvocationTargetException while invoking method for class : " + object.getClass().getName()
+ " and method : " + (null != methodRef ? methodRef.getName() : null));
}
}
static boolean skipObjectsCheck(Method method) {
if (method.getReturnType().isArray()) return true;
if (!(method.getGenericReturnType() instanceof ParameterizedType)) return false;
ParameterizedType parametrizedReturnType = (ParameterizedType) method.getGenericReturnType();
if (parametrizedReturnType.getRawType() == List.class
|| parametrizedReturnType.getRawType() == Set.class
|| parametrizedReturnType.getRawType() == Map.class) {
return true;
}
return false;
}
static Field getFieldByFieldName(Object obj, String fieldName) {
Field[] fields = obj.getClass().getDeclaredFields();
for(Field f : fields){
if (f.getName().equalsIgnoreCase(fieldName)) {
return f;
}
}
return null;
}
static boolean isGetType(Method method) {
if (method.getName().startsWith("get")) return true;
return false;
}
private static class Employee {
String name;
String city;
List<String> list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
}
输出
replaceAllEmptyStringFieldsWithNull converted blank string to null