首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请帮忙看一下哪里出错了?关于invoke()解决方法

2012-01-19 
请帮忙看一下哪里出错了?关于invoke()importjava.lang.reflect.*classClassA{publicstaticvoidmain(Strin

请帮忙看一下哪里出错了?关于invoke()
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;
      }
}

[解决办法]
以上程序运行没有错误:
java ClassA Point
执行结果为:
Loading Point
x=3,y=4


平常我们都是创建一个类的实例都是静态的,就是已经知道类的名字,比如:
A a = new A();
但是如果我们不能确定类的名字或者方法名字比如类名是一个变量s,s可以等于“A”也可以等于“B”,但要实例化它就要用到反射。
[解决办法]
还要研究下
才行
[解决办法]
invoke()方法是一个带有可变参数的方法,你将它改成ms[0].invoke(o)就可以了,至于什么是可变参数一句话说不清楚,你自己去查相关资料
[解决办法]
这个还真有点复杂

我用过个是那样的
当时测试时,要想取得一个类的私有变量,或者调用一个类的私有方法。就是用的这种方法。

比较复杂,

再查查吧!!

热点排行