import java.lang.reflect.*;
class ClassA
{
     public static void main(String[] args)
     {
           if(args.length!=1)
       {
           return;
       }
       try
       {
          Class c=Class.forName(args[0]);
          Constructor[] cons=c.getDeclaredConstructors();
          Class[] params=cons[0].getParameterTypes();
          Object[] paramValues=new Object[params.length];
          for(int i=0;i<params.length;i++)
          {
              if(params[i].isPrimitive())
              {
                    paramValues[i]=new Integer(i+3);                 }
           }
          Object o=cons[0].newInstance(paramValues);
          Method[] ms=c.getDeclaredMethods();
          ms[0].invoke(o,null);//出错行
       }
      catch(Exception e)
      {
            e.printStackTrace();
      }
        
 }
}class Point
{
    static
    {
        System.out.println("Loading Point");
    }
    int x,y;
    void output()
    {
         System.out.println("x="+x+","+"y="+y);
    }
    
   Point(int x,int y)
   {
          this.x=x;
          this.y=y;
   }
}

解决方案 »

  1.   

    教程上说:
        通过Class和反射API就可以动态的加载一个类,动态的创建这个类的一个实例,然后动态的去调用它的方法.
       有点糊涂,不是很清楚,希望高手点拨!
      

  2.   

    以上程序运行没有错误:
    java ClassA Point
    执行结果为:
    Loading Point
    x=3,y=4平常我们都是创建一个类的实例都是静态的,就是已经知道类的名字,比如:
    A a = new A();
    但是如果我们不能确定类的名字或者方法名字比如类名是一个变量s,s可以等于“A”也可以等于“B”,但要实例化它就要用到反射。
      

  3.   

    为什么我javac ClassA.java出来warning呢???
    提示如下:
    ClassA.java:25: warning: non-varargs call of varargs method with inexact argument type for last parameter;
    cast to java.lang.Object for a varargs call
    cast to java.lang.Object[] for a non-varargs call and to supprese this warning 
                            ms[0].invoke(o,null);
                                           ^
    1 warning
    但是java ClassA Point能出来结果
      

  4.   

    invoke()方法是一个带有可变参数的方法,你将它改成ms[0].invoke(o)就可以了,至于什么是可变参数一句话说不清楚,你自己去查相关资料
      

  5.   

    为什么改成ms[0].invoke(o)就可以通过运行呢???
    JAVA的docs中说这个方法 invoke(Object obj, Object... args)  是传两个参数啊???
      

  6.   

    你知道为什么invoke方法定义成invoke(Object obj, Object... args),而不是
    invoke(Object obj, Object args),
    知道Object... args的含义吗,不知道的话赶快去学
      

  7.   

    难道高手都不喜欢直接回答问题吗???(我想不是吧!)
    我的确是不懂不会不知道
    (我要是都懂都会都知道了我还在这混什么嘛?我早就去帮别人解决问题去了)
    我的确应该学习,我也正在学啊!!!
    这是我自学JAVA的第十天,或许其中的无奈只有自己懂,硬硬头皮坚持吧!
    在学习JAVA的道路上,我也遇到了很多好朋友,衷心的谢谢你们!!!
    各位高手回想一下自己的学习历程,
    难道就不希望指点一下新手,难道就不希望新手们少走一些弯路吗???
    鼓励也好,批评也罢,我都欣然接受.
    我现在的水平就是很菜,所以我就要问!就要问!厚着脸皮问!
    当然自己也会加把劲的学!
    我相信会人答复我的!!!
    还是谢谢大家!!!