具体代码如下://Operator.javapackage org.bromon.reflect;public interface Operator{       public java.util.List act(java.util.List params);}-------------------------------------------------------------------------------//Success.javapackage org.bromon.reflect;import java.util.*;
public class Success implements Operator{       public java.util.List act(java.util.List params)
       {              List result=new ArrayList();              result.add(new String("操作成功"));              return result;       }}-----------------------------------------------------------------------------------//emp.properties#成功响应1000=Success#向客户发送普通文本消息2000=Load#客户向服务器发送普通文本消息3000=Store--------------------------------------------------------------------------//Testreflect.javaimport org.bromon.reflect.Operator;import java.util.*;import java.lang.reflect.*;import java.io.*;public class TestReflect
{
       //加载配置文件,查询消息头对应的类名
       private String loadProtocal(String header)
    {
        String result=null;
       try       {           Properties prop=new Properties();           FileInputStream fis=new FileInputStream("emp.properties");
           prop.load(fis);
           result=prop.getProperty(header);
           fis.close();
        }catch(Exception e)       {           System.out.println(e);       }        return result;
    }    //针对消息作出响应,利用反射导入对应的类    public String response(String header,String content)    {        String result=null;        String s=null;       try        {
          
           s="org.bromon.reflect."+this.loadProtocal(header);           //加载类           Class c=Class.forName(s);           //创建类的事例           Operator mo=(Operator)c.newInstance();           //构造参数列表           Class params[]=new Class[1];           params[0]=Class.forName("java.util.List");           //查询act方法           Method m=c.getMethod("act",params);           Object args[]=new Object[1];
           args[0]=content;
           //调用方法并且获得返回
           Object returnObject=m.invoke(mo,args);
        }catch(Exception e)
       {           System.out.println("Handler-response:"+e);       }
        return result;
    }
    public static void main(String args[])    {        TestReflect tr = new TestReflect();
        tr.response(args[0],"消息内容");
    }}编译通过,但键入java TestReflect 1000时出现
Handler-response:java.lang.IllegalArgumentException: argument type mismatch另外编译Success.java时有提示:
Note: Success.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details. 不知道是什么原因,求教.

解决方案 »

  1.   

    你的Success类的act方法需要的参数是一个List。
    在Object returnObject=m.invoke(mo,args);语句中,第二个参数args实际上就是act方法的参数列表。数组中的每个元素就是方法中的一个参数。
    你的args数组中,第一个元素是一个content,类型是String。而你的act方法需要的参数类型是List,当然不行啊。应该改成:
     Object args[]=new Object[1];
     List listParam = new ArrayList();
     listParam.add(content);
     args[0]=listParam;
     Object returnObject=m.invoke(mo,args);
    这样参数类型才正确。
      

  2.   

    to afrag:谢谢,的确参数类型的问题,修改后可以就装载了还有个问题想请教下,编译后我键入java TestReflect 1000 (载入Success,得到结果应该是会显示"操作成功")但实际却没有显示.因为在Success里加入println语句是可以显示的,可以确定类已载入,请问result.add(new String("操作成功"));这里使用有误么?
      

  3.   

    没有看到你的代码里面有显示消息的代码啊?
    result.add(new String("操作成功"));
    只是将字符串"操作成功"加到了队列中,不会显示出来。