A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严明 初级黑马   /  2012-6-25 17:47  /  2704 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天老师要求做个飞机大战的小程序,上网搜了一下,找到一些源代码,其中有一段这样的,我简写一下:
package com.test;
class FlyDemo
{
        static
        {
                System.out.println("Hello,FlyDemo");
        }
}

public class Test
{
       publicstatic void main(String[] args) throws Exception
       {
                  
ClassLoader loader =ClassLoader.getSystemClassLoader();
                  Class<?> clazz = loader.loadClass("com.test.FlyDemo");  //这句有点不是很明白,好像是加载类的吧?
                  clazz= Class.forName("com.test.FlyDemo");    //这句没有new 怎么就创建对象了呢?
     }

}

我运行了一下,结果是: 创建对象不是应该new 一下的吗?

Hello,FlyDemo

















3 个回复

正序浏览
    publicstatic void main(String[] args) throws Exception
       {
                  
ClassLoader loader =ClassLoader.getSystemClassLoader();
                  Class<?> clazz = loader.loadClass("com.test.FlyDemo");  //这句有点不是很明白,好像是加载类的吧?
                  clazz= Class.forName("com.test.FlyDemo");    //这句没有new 怎么就创建对象了呢?
     }
楼主:
1. FlyDemo 类中的打印的 Hello,FlyDemo,是类中静态代码块,他是优先于对象创建时,先被执行到的代码块。
ClassLoader的loadClass方法,是装配类的意思,具体可以参考下API中, ClassLoader的方法,我写简单点
loadClass方法方法干了些什么
  简单我们先了解下: Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化。这个步骤是严格按顺利进行的。
  也就是说 没有链接,就不会进行初始化这个步骤。
那么ClassLoader的loadClass方法 干嘛了呢,他会在内部调用 ClassLoader.loadClass(className,false); 方法去干活,第二个参数会默认传个false进去,
false代表对象被装载后不进行链接,这就意味这不会去执行该类静态块中间的内容。

那么我们就 明确了 Class<?> clazz = loader.loadClass("com.test.FlyDemo");  不会初始化 静态块的代码,此这语执行后不会去 打印出Hello,FlyDemo。

二、Class.forName("xxxx")又干嘛了呢,它会把活 交给Class.forName(className,true,classloader); 来干。
注意,第二个参数中是 true呢,它表示是在loadClass后必须进行 链接 初始化。
所以会在这个位置去,调用初始化这个静态的代码块。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
clazz= Class.forName("com.test.FlyDemo");只是加载这个类,并没有实例化,
但是这个被加载的类有静态代码块所以打印出Hello,FlyDemo,
实例化可以 FlyDemo flyDemo =(FlyDemo)Class.forName("com.test.FlyDemo").newInstance(); 等同于
FlyDemo flyDemo=new FlyDemo();
回复 使用道具 举报
clazz= Class.forName("com.test.FlyDemo"); 这个语句是用反射的方式直接得到文件的字节码,等你看过反射的视频就懂了,就是这样创建的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马