获取类中的方法
业务中有时候需要通过反射获取类中的方法进行相关操作,以下给出项目中遇到的例子,通过反射将想要复制属性值进行复制到另外一个类中
Method[] getMethods = JcsjXsVo.class.getMethods();
for (Method getMethod : getMethods) {
if (getMethod.getName().indexOf("getCy1") != -1) {
String jtcyField = org.apache.commons.lang3.StringUtils.uncapitalize(getMethod.getName().split("getCy1")[1]);
String value = (String) getMethod.invoke(jcsjXsVo);
Method setMethod = DbQjyXsrxXsJtcy.class.getMethod("set"
+ org.apache.commons.lang3.StringUtils.capitalize(jtcyField), jtcyField.getClass());
setMethod.invoke(jtcy, value);
}
}
对象属性
Spring 框架为了实现无侵入式设计,使用了大量Java反射机制,比如 Bean Wrapper 的设计。
以下是在早期项目代码中使用BeanUtils.copyProperties原生工具对对象进行拷贝的时候,想要让指定字段不进行拷贝的时候,需要传入字段属性数组。项目中利用反射获取对象中空和空串字段再拼接为数组,相关代码如下:
public static String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet();
for (java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null || Strings.isNullOrEmpty(srcValue.toString())) {
emptyNames.add(pd.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
反射获取字段的值与非空校验
private void emptyValid(Object obj) {
try {
Class<?> clzz = obj.getClass();
Field[] fields = clzz.getDeclaredFields();
for(Field field : fields ) {
Field field = clzz.getDeclaredField(field.getName());
field.setAccessible(true);
Object val = (Object)field.get(obj);
if(null == val || "" == val) {
System.out.println("值为空");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
```java // 通过字段对应的get方法
public Object getFieldValueByGet(String fieldName, Object obj) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = “get” + firstLetter + fieldName.substring(1); Method method = obj.getClass().getMethod(getter, new Class[] {}); Object value = method.invoke(obj, new Object[] {}); return value; } catch (Exception e) { return null; } }
// 通过字段 public Object getFieldValueByName(String fieldName, Object obj) { try { Field field = obj.getClass().getDeclaredField(fieldName); field.setAccessible(true); Object value = field.get(obj); return value; } catch (Exception e) { e.printStackTrace(); return null; } } ```