在读<<thinking in java 4th>>
用到如下代码的时候用到Class.forName()
在前面的例子中也有Class.forName()方法 但依据例子的说法 他不只以完全限定字符串参数产生类型引用 还会执行静态语句 也会执行构造器 这就是说他会实例化 这么理解没错吧 但在下面的例子重 我加了点信息验证 既Class.forName()调用FancyToy构造函数再调用Toy构造函数    却并没有实例化 哪理解错了吗?Class.forName().newInstance()才会实例化 newInstance()前面只会返回引用? 另外有关package 在下面这段代码中package typeinfo.toys;
然后用CMD 进到CLASS所在目录下竟然也说CLASS.NOT.FOUND 异常 按照JAVA的机制 不应该是classpath + “import(全限定名)”的路径自己找吗 我加了“。” 他怎么还找不到。    命令行下非得用 basedir + typeinfo.toys.ToyTest才能用。。
按照我的理解 在本文件重 import自己(绿色段)然后 进到 basedir 然后再-java ToyTest 不就是basedir + typeinfo.toys.ToyTest了吗 这也是报错的。。版面排的比较乱 找了半天没找到在哪改不好意思 谢谢了package typeinfo.toys;

//import typeinfo.toys.*;interface HasBatteries{} //接口位置
interface Waterproof{}
interface Shoots{}class Toy{
Toy(){
System.out.println("here Toy() constructor load!");
}
Toy(int i){
System.out.println("here Toy(int i) constructor load from \"FancyToy(){super(1)}\""); }
}

class FancyToy extends Toy implements HasBatteries,Waterproof,Shoots{
FancyToy(){super(1);}    //super 调用父类构造函数
//FancyToy(int i){}
static{
System.out.println("here FancyToy static statment!");
}
}

public class ToyTest{

static void printfInfo(Class cc){
System.out.print("class name:\"" + cc.getName() + "\" is interface?");
System.out.println("[" + cc.isInterface() + "]");
System.out.println("SimpleName:\"" + cc.getSimpleName() + "\"");
System.out.println("CanonicalName:\"" + cc.getCanonicalName() + "\"");

}

public static void main(String[] args){
Class c = null;
try{
//Class c = Class.forName("typeinfo.toys.FancyToy");  这样c变成了局部变量在域{}外失效
c = Class.forName("typeinfo.toys.FancyToy");
}catch(ClassNotFoundException e){
System.out.println("ClassNotFound!");
System.exit(1);
}
printfInfo(c);

for(Class face : c.getInterfaces())printfInfo(face);


Class up = c.getSuperclass(); //注意观察构造函数信息判断方法是否初始化 OR 只返回引用 up.newInstance() - -! 应为只返回引用


Object obj = null;

try{
System.out.println("after c.getSuperclass() and newInstance()");
obj = up.newInstance();
//up.newInstance();
}catch(InstantiationException e){
System.out.println("Cannot instanciate!");    
System.exit(1);
}
catch(IllegalAccessException e){
System.out.println("Cannot access!");
System.exit(1);
}
printfInfo(obj.getClass());
}
}

解决方案 »

  1.   

    没有听说,class.forName("")会实例化一个对象,它应该是加载一个类,并不能实例化。
      

  2.   

    如果只是加载类的话 static{      System.out.println("here FancyToy static statment!"); }
    这条语句(在class FancyToy中) 也是应该运行的啊?它也没有输出
      

  3.   

    我也在看think in java,但是里面也是说是加载吧
      

  4.   


    public class Test {   
      public static void main(String [] args) throws Exception{
      Class.forName("xxx.ddd");
      } }   
    class ddd{
    static{ 
          System.out.println("here FancyToy static statment!"); 

    public ddd(){
    System.out.println("######################3333");
    }
    }out:
    here FancyToy static statment!
    怎么会没有输出呢?你试试
      

  5.   

    俺的也有,楼主,你jdk版本多少啊?
      

  6.   

    可能是JDK版本的问题 我用1.6的
    调用默认的Class.forName(str)  可以初始化, 如果你非要在加载的时候初始化你可以调用显式的加载方法,调用方法如下:Class<?> c = Class.forName(ClassName, true, ClassLoader);
    中间的参数就是表示在加载的时候是否初始化静态块的
      

  7.   

    class.forName()也就是创建一个累的对象
      

  8.   

    我上面的确实写了
    class FancyToy extends Toy implements HasBatteries,Waterproof,Shoots{ 
       FancyToy(){super(1);}  //super 调用父类构造函数 
       //FancyToy(int i){} 
       static{ 
          System.out.println("here FancyToy static statment!"); 
       } 

    也有
    c = Class.forName("typeinfo.toys.FancyToy"); javac  java 确实就没输出这句 所以问出了这问题
    想上图 还得先上传出网络地址 这BBS系统。
      

  9.   

    javac java 你是怎么运行的?
      

  10.   


    JDBC时,好像会实例化一个对象.
      

  11.   


    只是加载这个类? 这个 “加载”的意思是为static分配空间 运行构造器 并初始化 这不已经就是创建了这个类的对象了吗?
    这些动作和创建这个类的对象还有什么区别?
    另:我运行java javac 时候没加参数 就这么运行的
      

  12.   

    初始化包括两个部分,
    第一是类的初始化;
    第二是对象的创建;
    类的初始化是类加载的最后一步,在class.forName()并没有创建一个类的对象,
    如果创建了,那么,看下边的程序:public class Test {   
      public static void main(String [] args) throws Exception{
      Class.forName("xxx.dd");
      } 
    }   
    class dd{
    public dd(){
    System.out.println("ddd");
    }
    static{
    System.out.println("static");
    }
    }运行的结果是static,并没有ddd输出,这说明什么,再说,创建类的对象在哪儿?
    应该说创建了该类的class对象,并不是该类的实例对象。
      

  13.   

    类的加载并不是向你想象的那样,为static分配空间 运行构造器 并初始化。
      

  14.   

    类的加载包括类型的装载,连接,初始化,(其中的连接阶段包括验证,准备,解析)而在加载阶段之后我们就可以使用这个类了,包括调用他的静态方法,实例化一个该类的对象。你可以看看深入jvm的第7章。
      

  15.   

    啊 滤一下
    先找到 *.class字节码 装载  --> 然后连接(执行字节码检查 不良代码) --> 初始化  这里包括类型的初始化 此时STATIC代码段得到执行 在此之后可以直接调用静态方法(可以叫做创建CLASS对象?) 如果有需要 可以创建对象 即 对象的初始化 这时构造函数工作 Class.forName()返回一个 类型初始化后的结果(先这么说吧 - -!)