问一个关于java运用反射动态执行某个方法的问题。

CHID 2012-02-20 03:20:55
//问题如下:
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)
{

}
}
...全文
435 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
右领军大都督 2012-02-20
  • 打赏
  • 举报
回复
参考如下代码:

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();
}
}

}

安特矮油 2012-02-20
  • 打赏
  • 举报
回复
完全可以的,但是你需要知道参数的类型和个数。如果参数类型和个数不匹。
写了一段例子,希望对你有帮助

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));
}
}
wula0010 2012-02-20
  • 打赏
  • 举报
回复
可以的,但是你要保证你传递的参数和要执行的方法的参数匹配。
DreamCatcher 2012-02-20
  • 打赏
  • 举报
回复
/**
* 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);
}

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧