在开发过程中,我们会碰到一些需要使用到反射的地方。以前通用的步骤为:
1.根据属性名称拼接出对应的get/set方法;
2.invoke该对象去调用相应的方法进行取值/赋值操作。
示例如下:
// 拼接出set方法名 String name = systemPreferences2.getName(); StringBuffer sb = new StringBuffer(); sb.append("set"); sb.append(name.substring(0, 1).toUpperCase()); sb.append(name.substring(1)); Class<?> objectClass = ftpServer.getClass(); Class<?>[] parameterTypes = new Class[1]; Field field; try { field = objectClass.getDeclaredField(name); parameterTypes[0] = field.getType(); // 获取该方法 Method method = objectClass.getMethod(sb.toString(),parameterTypes); // 执行该set方法 String type = parameterTypes[0].getName(); if (type.equals("java.lang.String")) { method.invoke(ftpServer, new Object[] { (String) systemPreferences2.getValue() }); } else if (type.equals("int")) { method.invoke(ftpServer, new Object[] { new Integer((String) systemPreferences2.getValue()) }); } else if (type.equals("boolean")) { method.invoke(ftpServer, new Object[] { new Boolean((String) systemPreferences2.getValue()) }); } } catch (Exception e) { logger.debug("there is something wrong with reflact", e.getMessage()); }
经过google检索及查阅JDK API,发现 java.beans.PropertyDescriptor 类为我们使用反射提供了很大的便利,介绍如下:
1.该类有一个构造函数,
PropertyDescriptor(String propertyName,Class<?> beanClass) throws IntrospectionException
通过调用 getFoo 和 setFoo 存储器方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。
2.该类有如下两个方法:
getReadMethod() 获得应该用于读取属性值的方法。
getWriteMethod() 获得应该用于写入属性值的方法。
比起我们自己去拼接方法名,再去获取进行执行要方便很多
该方法使用示例如下:
try { Class<?> objectClass = oltPerfTargetCycle.getClass(); PropertyDescriptor pd = new PropertyDescriptor(perfName, objectClass); Method getMethod = pd.getWriteMethod();//获得set方法 getMethod.invoke(oltPerfTargetCycle, perfTargetCycle.getInterval_()); } catch (Exception e) { logger.info("reflactToOltPerfTargetCycle is error: {}", e); }
try { Class<?> objectClass = cmcPerfTargetCycle.getClass(); PropertyDescriptor pd = new PropertyDescriptor(perfName,objectClass); Method getMethod = pd.getReadMethod();//获得get方法 Integer value = (Integer) getMethod.invoke(cmcPerfTargetCycle);//执行get方法获取对应性能指标的值 } catch (Exception e) { // 如果没有对应的属性,或者无相应的方法,则抛出异常到此 logger.info("this property don't exist, or there is no proper get method!"); }