//问题如下:
public class Users {
private String UserID;
private String UserName;

public String getUserName() {
return this.UserName;
}
public void setUserName(String userName) {
this.UserName = userName;
}
public String getUserID() {
return this.UserID;
}
public void setUserID(String userID) {
this.UserID = userID;
}

//提供类名称,方法名称,以及方法中参数的值,能否通过反射,执行某个方法?
//例如动态的执行“Users”类的“setUserID”方法,将this.UserID的值 设置为“administrator”?
public void execute(String ClassName,String MethodName,String ParameterValue)
{

}
}

解决方案 »

  1.   

    /**
     * Invokes accessible method of an object.
     *
     * @param c       class that contains method
     * @param obj     object to execute
     * @param method  method to invoke
     * @param paramClasses classes of parameters
     * @param params  parameters
    �  */
    public static Object invoke(Class c, Object obj, String method, Class[] paramClasses, Object[] params) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
    Method m = c.getMethod(method, paramClasses);
    return m.invoke(obj, params);
    }在不知道参数类型的情况下:
    /**
     * Returns classes from array of specified objects.
     */
    public static Class[] getClasses(Object... objects) {
    if (objects == null) {
    return null;
    }
    Class[] result = new Class[objects.length];
    for (int i = 0; i < objects.length; i++) {
    if (objects[i] != null) {
    result[i] = objects[i].getClass();
    }
    }
    return result;
    }
    /**
     * Invokes accessible method of an object without specifying parameter types.
     * @param obj    object
     * @param method method of an object
     * @param params method parameters
     */
    public static Object invoke(Object obj, String method, Object[] params) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
    Class[] paramClass = getClasses(params);
    return invoke(obj, method, paramClass, params);
    }
      

  2.   

    完全可以的,但是你需要知道参数的类型和个数。如果参数类型和个数不匹。
    写了一段例子,希望对你有帮助public class Test {
    public static void main(String[] args) throws Exception{
    List list = new ArrayList();
    Class c = Class.forName("java.util.ArrayList");
    Method method = c.getDeclaredMethod("add", new Class[]{Object.class});
    method.invoke(list, new Object[]{new Integer(100)});
    System.out.println(list.get(0));
    }
    }
      

  3.   

    参考如下代码:public class Users { private String UserID;
    private String UserName; public String getUserName() {
    return this.UserName;
    } public void setUserName(String userName) {
    this.UserName = userName;
    } public String getUserID() {
    return this.UserID;
    } public void setUserID(String userID) {
    this.UserID = userID;
    }}import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;public class Test { public static void main(String[] args) {
    Test test = new Test();
    Users user = new Users();
    test.execute(user, "Users", "setUserName", "张三");
    // 通过反射已经设置了Users对象的userName属性为张三,下面打印
    System.out.println(user.getUserName());
    } /**
     * 
     * @param obj
     *            待执行方法的对象
     * @param ClassName
     *            待执行方法对象的类
     * @param MethodName
     *            待执行的方法名
     * @param ParameterValue
     *            待执行方法的参数
     */
    public void execute(Object obj, String ClassName, String MethodName,
    String ParameterValue) {
    Class cls = null;
    try {
    cls = Class.forName(ClassName);
    } catch (ClassNotFoundException e) {
    // 通过ClassName反射获取该类失败
    e.printStackTrace();
    }
    Method method = null;
    try {
    method = cls.getMethod(MethodName, String.class);
    } catch (SecurityException e) {
    // 通过MethodName反射获取该方法失败,SecurityManager校验失败
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // 通过MethodName反射获取该方法失败,该方法不存在
    e.printStackTrace();
    }
    try {
    method.invoke(obj, ParameterValue);
    } catch (IllegalArgumentException e) {
    // 反射执行该方法失败,参数不正确
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // 反射执行该方法失败,无法执行
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // 反射执行该方法失败,该方法本身抛出异常
    e.printStackTrace();
    }
    }}