后端开发-反射方法推荐

时间:2022-08-28 12:19:17

在开发过程中,我们会碰到一些需要使用到反射的地方。以前通用的步骤为:

    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!");
}