大家帮帮我吧?我找了好久了,不知道是什么错误,分不够再加==================== Reflect class:
package Reflect;import java.lang.reflect.Method;import Constance.Constance;
import Debug.Debug;public class Reflect {  private Reflect() {
  }  // new class function
  private static Class getClass(String strClassName) throws Exception {
    try {
return Class.forName(strClassName);
} catch (ClassNotFoundException e) {
Debug.PrintlnAndThrowException(Constance.OUT_ERROR
+ " Reflect>getClass>"
+ e.getMessage());
}
return null;
  }
  // new instance function
  private static Object newInstance(Class cls) throws Exception{
     try {
return cls.newInstance();
} catch (Exception e) {
Debug.PrintlnAndThrowException(Constance.OUT_ERROR
+ " Reflect>newInstance>"
+ e.getMessage());
}
return null;
  }  // return method function
  private static Method getMethod(Class cls,String method,Class[] list) throws Exception{
    try {
return cls.getMethod(method,list);
} catch (SecurityException e) {
Debug.PrintlnAndThrowException(Constance.OUT_ERROR
+ " Reflect>getMethod>"
+ e.getMessage());
}
return null;
  }  // do Reflect
  public synchronized static Object invoke(String classname,Object[] args,String method) throws Exception{      // create list class
      Class[] list = new Class[args.length];
      for (int i = 0; i < args.length; i++) {
        list[i] = args[i].getClass();
      }      // create object
      Class cls = Reflect.getClass(classname);
      Object obj = Reflect.newInstance(cls);
      Method mod = Reflect.getMethod(cls, method, list);      try {
mod.invoke(obj, args);
} catch (IllegalArgumentException e) {
Debug.PrintlnAndThrowException(Constance.OUT_ERROR
+ " Reflect>invoke>"
+ e.getMessage());
}

Debug.Println(Constance.OUT_INFORMATION
+ obj.toString());      return obj;  }
}================= ReflectAction class:
package Reflect;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionForm;import Action.IAction;
import Constance.Constance;
import Debug.Debug;public class ReflectAction {

public synchronized static String goForward(String classname,ActionForm form,HttpServletRequest request){

Object[] args = new Object[2];
args[0] = form;
args[1] = request;

IAction action = null;

try {
action = 
(IAction) Reflect.invoke(
classname,args,Constance.STRUTS_ACTION_GOFORWARD);
} catch (Exception e) {
Debug.Println(
Constance.OUT_ERROR
+ " ReflectAcionClassError:"
+ e.getMessage());
return "error";
}

return action.getForward();
}

}=================== 调用类 Login class:
package Action;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionForm;import Constance.Constance;
import DTO.AddressListClass;
import com.sms.struts.form.LoginForm;public class Login extends AbsAction {

private LoginForm loginform;
private HttpServletRequest request;

public Login(){
}

public void goForward(ActionForm form,HttpServletRequest request){
this.loginform = (LoginForm)form;
this.request = request;

AddressListClass login = null;
try {
login = new AddressListClass(this.loginform.getIntername());
login.setInterName(this.loginform.getIntername());
login.Fill();
} catch (Exception e) {
System.out.println(e.getMessage());
this.gotoError();
return;
}

if (login.getPhone().equals(loginform.getPhonenumber())){
//登录成功
//添加session值
this.request.getSession().setAttribute(
Constance.TABLE_ADDRESSLIST_INTERNAME,login.getInterName());
this.gotoQueryNote();
return;
}
this.gotoError();
return;
}
}现在我在 struts的Action里这样调用
return mapping.findForward(ReflectAction.goForward(
Constance.STRUTS_ACTION_LOGIN,form,request));
报错:
ReflectAcionClassError:Action.Login.goForward(com.sms.struts.form.LoginForm, org.apache.coyote.tomcat5.CoyoteRequestFacade)谢谢高手们了!~

解决方案 »

  1.   

    你的设计有问题,你获取method的时候,不应该是根据每个参数(Object[] args)的实际类型(.getClass())来作为Method的参数类型,而应该是方法定义时候的类型,即使那些实际类型是方法定义的参数类型的子类型也不行。举个例子来讲
    java.util.Date.before(java.util.Date): boolean 方法
        java.util.Date d = new java.sql.Date(System.currentTimeMillis());
        Class clazz = Date.class;
        Method method = clazz.getMethod("before", new Class[] {java.util.Date.class});
        System.out.println(method.invoke(new java.util.Date(), new Object[] {
          d
        }));和    java.util.Date d = new java.sql.Date(System.currentTimeMillis());
        Class clazz = Date.class;
        Method method = clazz.getMethod("before", new Class[] {d.getClass()});
        System.out.println(method.invoke(new java.util.Date(), new Object[] {
          d
        }));前者,在靠反射动态找Method的时候,“静态”指定了参数类型java.util.Date.class,因而成功,而后者在运行期,“动态”指定了参数的实际类型java.sql.Date.class,虽然sql date也是util date,但是仍然抱错
    java.lang.NoSuchMethodException: java.util.Date.before(java.sql.Date)
    at java.lang.Class.getMethod(Class.java:1581)