黑马程序员技术交流社区

标题: 初学反射遇到的不解 [打印本页]

作者: 谭立文    时间: 2012-6-24 22:05
标题: 初学反射遇到的不解
本帖最后由 谭立文 于 2012-6-25 15:56 编辑

import java.util.Date;

public class Test {

    public static void main(String[] args)
    {  
            Class class1 = java.util.Date.class;
            System.out.println(class1.hashCode());

            Date date = new Date();
            Class class2 = date.getClass();
            System.out.println(class2.hashCode());
    }

}
输出的两个hashCode为什么相同。
作者: 丁二跃    时间: 2012-6-24 22:11
还没仔细学反射…………不过class1 和 class2 好像代表的都是Date 这个字节码吧
作者: 周兴中    时间: 2012-6-24 22:18
本帖最后由 周兴中 于 2012-6-24 22:47 编辑

import java.util.Date;

public class Test {

    public static void main(String[] args)
    {  
            Class class1 = java.util.Date.class; // java.util.Date等同于Date ,每一个.class文件都有一个自身的字节码,在内存中只有一个Date类对应的字节码.     
           System.out.println(class1.hashCode());

            Date date = new Date();  // 由于你新建的实例对象也由java.util.Date 类创建,所以他们的字节码是一样的, Class.forName("java.util.Date"); 也将得到同样的字节码,这3种是最常使用的获取字节码方式.
            Class class2 = date.getClass();
            System.out.println(class2.hashCode());
    }

}

请参考 张孝祥Java高新技术第17个视频.
作者: 谭立文    时间: 2012-6-24 22:21
周兴中 发表于 2012-6-24 22:18
import java.util.Date;

public class Test {

这样是可以的。
作者: 唐辉辉    时间: 2012-6-24 22:34
本帖最后由 唐辉辉 于 2012-6-24 22:35 编辑

因为它们的字节码对象是同一个。 只要是同种类型的,在加载进来的是同一个字节码对象。
作者: 张华廷    时间: 2012-6-24 22:54

每一个.class文件都有一个自身的字节码,在加载进来只要是同种类型就为同一个字节码对象。 Date date = new Date();  新建的实例对象由java.util.Date 类创建,所以他们的字节码是一样的, Class.forName("java.util.Date"); 也将得到同样的字节码,它们的字节码对象是同一个。
作者: 黄奕豪    时间: 2012-6-25 13:22
事实证明,这两份字节码hashCode是一样的!
作者: 陈少文    时间: 2012-6-25 14:52
楼主要判断这两个hashCode有什么相同

其实是一样的
可以 == 来验证
代码如下:

*/

import java.util.Date;

public class Test {
        
        public static void main(String[] args)
    {  
            Class class1 = java.util.Date.class;
            System.out.println(class1.hashCode());

            Date date = new Date();
            Class class2 = date.getClass();
            System.out.println(class2.hashCode());
            
            //打印结果为true
             System.out.println(class1.hashCode() == class2.hashCode());
    }

}
作者: 周朋飞    时间: 2012-6-25 18:31
只有采用hash算法的那些集合像 hashSet 这些重写hashcode算法才有效
由于Date类在编译之后在内存当中的就是一份字节码 是一样的 这就好像 你定义两个String 对象 通过反射获得字节码也是一样的 是一个道理




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2