【java】反射设值取值、调用方法

1、设值

/**
  * 根据属性名设置属性值
  *
  * @param fieldName
  * @param object
  * @return
  */
 public boolean setFieldValueByFieldName(String fieldName, Object object,String value) {
     try {
        // 获取obj类的字节文件对象
        Class c = object.getClass();
        // 获取该类的成员变量
        Field f = c.getDeclaredField(fieldName);
        // 取消语言访问检查
        f.setAccessible(true);
        // 给变量赋值
        f.set(object, value);
        return true;
     } catch (Exception e) {
         log.error("反射取值异常",e);
         return false;
     }
 }

2、取值

/**
 * 根据属性名获取属性值
 *
 * @param fieldName
 * @param object
 * @return
 */
public Object getFieldValueByFieldName(String fieldName, Object object) {
    try {
        Field field = object.getClass().getDeclaredField(fieldName);
        //设置对象的访问权限,保证对private的属性的访问
        field.setAccessible(true);
        return  field.get(object);
    } catch (Exception e) {
        log.error("反射设值异常",e);
        return null;
    }
}

3、反射调用无参方法

public void execution(String className, String methodName) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
    Class<?> aClass = Class.forName(className);
    Object obj = aClass.newInstance();
    Method method = aClass.getMethod(methodName);
    method.invoke(obj);
}

4、反射调用有参方法

/**
 * 这里只列举只有一个参数的情况,多个类似
 * 
 * @param className
 * @param methodName
 * @param parameter 参数
 * @throws ClassNotFoundException
 * @throws IllegalAccessException
 * @throws InstantiationException
 * @throws NoSuchMethodException
 * @throws InvocationTargetException
 */
public void execution(String className, String methodName, Object parameter) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
    Class<?> aClass = Class.forName(className);
    Object obj = aClass.newInstance();
    Method method = aClass.getMethod(methodName, parameter.getClass());
    method.invoke(obj, parameter);
}

5、反射调用方法(无参也适用)

/**
 * 反射调用方法
 *
 * @param className 全限定类名,例如:com.xiaostudy.test.Mytest1
 * @param methodName 方法名,例如:show
 * @param parameters 0或多个参数
 * @throws ClassNotFoundException
 * @throws IllegalAccessException
 * @throws InstantiationException
 * @throws NoSuchMethodException
 * @throws InvocationTargetException
 */
public static void execution(String className, String methodName, Object... parameters) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
    Class<?> aClass = Class.forName(className);
    Object obj = aClass.newInstance();
    Class[] classes = new Class[parameters.length];for (int i = 0, length = parameters.length; i < length; i++) {
        classes[i] = parameters[i].getClass();
    }
    Method method = aClass.getMethod(methodName, classes);
    method.invoke(obj, parameters);
}
原文地址:https://www.cnblogs.com/xiaostudy/p/11642516.html