看今天看关于class类里的newInstance()方法说是调用类中缺省的构造方法,说有一个好处是在不知道类的名字的时候创建一个类对象
具体程序流程是if(args.length!=1){
return;
}
else{
try{
Class c=Class.forName(args[0]);
Point p=(Point)c.newInstance();//问题在这里
}
catch(Exception e){
e.toSing();
}
}
Point类已经创建完,在上面的问题中这不就声明了Point类型了嘛,并且后面还把这个对象强制转换成point类型付给p,这怎么能说是不知道类名字呢?能否具体解释一下,给我一个实例证明...

解决方案 »

  1.   

    程序没有问题,除了一个拼写错误 toSing =》toString在命令行上输入类名时直接用Point类不行,应该跟上完整的包路径,如chapter6.reflection.Point
      

  2.   

    或者指定程序运行时的classpath,让程序能找到Point类
      

  3.   

    嗯假设包名等其他外在因素都合理,就考虑他"说有一个好处是在不知道类的名字的时候创建一个类对象"这句话,可是下面他还是要定义POINT类的变量来存放这个对象,这不就知道自己要用的那个类了么?而且还要强制把OBJECT转换成POINT,这newInstance()到底有什么用啊?
      

  4.   

    看一下这两句话:
    Class c=Class.forName(args[0]);
    Point p=(Point)c.newInstance();//c.newInstance()肯定是不知道类名的吧,但是已经实例化了说有一个好处是在不知道类的名字的时候创建一个类对象,就是指的这个实例化以后还是必须要通过强制类型转化指定到那个具体类(Point)的。
      

  5.   

    A a = new A();调用class A的构造方法构造一个对象
    A a = A.newInstance();
    应该是A a = (A)A.class.newInstance();
    这个也是调用class A的无参数构造方法构造一个对象,由于这个是Class类的方法,返回的是Object,需要做类型转化,同时newInstance是调用的无参数构造方法,所以class A中必须要有无参数构造方法,而且可以被调用,否则会产生异常。
    一般来说newInstance方法用于动态加载Class并产生实例的情况下使用,singleton模式和这个方法没有什么关系,而且多次调用netInstance方法产生的对象是不同的。