System.out.println(Test.class.getClass());看来Object里面有个 
protected Class class;呵呵 瞎猜的 看Object的代码 那么多native 谁知道他都干嘛了

解决方案 »

  1.   

    xxx.class是特殊用法,代表 xxx 的Class对象
      

  2.   

    xxx.class是特殊用法,代表一个Class对象实例,
    这个对象描述了类xxx的信息.这么说应该清楚一些了.
      

  3.   

    谁能说的更清楚一些?class是保留字,不是什么方法和属性吧。
      

  4.   

    XX.class与 new XX().getClass()返回的是同一个东西。
    看如下测试代码,它返回的是true
    public class TestClass
    {
        public TestClass()
        {
        }
        public static void main(String[] args)
        {
            TestClass t = new TestClass();
            Object a,b;
            System.out.println(a=t.getClass());
            System.out.println(b=TestClass.class);
            System.out.println(a.equals(b));
        }
    }
      

  5.   

    个人认为不能简单的认为.class 和class是一样的.
    具体使用javap反编译一下代码就知道了
      

  6.   

    我知道  new XX().getClass()返回的是同一个东西。但我不明白 .class的原理?具体怎么实现?
      

  7.   

    xxx.class
    表示的是一个Class(类)的实例,当然是继承子Object而Object有一个toString()方法,也就是说所有的对象都可以用System.out.println(**),实际上就是System.out.println(***.class.toString)记住xxx.class是一个类实例就好了
      

  8.   

    实际上这里没有什么原理,因为这是Java语言规范就是这样的,将.class看作对应的类的Class对象静态的显式引用,事实上类装载后该类就由虚拟机自动产生了,并作为一个静态对象存在的.
      

  9.   

    这个是java中对于rtti的支持obj.getClass和
    Object.class是一样的。
      

  10.   

    反正是个关键字用法
    ejb中经常用到
    eg:
    LocalProductHome home=(LocalProductHome)PortalbeRemoteObject.narrow(yourref,LocalProductHome.class);
    不知是什么时候加进这个用法的,俺也没看见过正式声明过
      

  11.   

    请教: teva(用正确的理论引导人) ,
    什么是rtti? rtti是什么的缩写?
    谢谢!
      

  12.   

    大家不会让我死记硬背吧,谁能把RTTI说的详细一点,就像侯捷先生的深入浅出MFC吧rtti说的太清楚了。
      

  13.   

    to:Patrick_DK(我有我的调调,就是这么屌) 看来,你知道答案了,能否说明白一点?
      

  14.   

    该用法和 Class c = Class.forName("xxx")是效果一样的,不同的是xxx.class会在编译时确定了的,而forName是动态确定的.如果这一点都记不住的话...寒~
      

  15.   

    我想弄清楚的是java RTTI的原理,谁能说明白这点我给高分。
      

  16.   

    Class是一个特殊的类,用来保存 类型(class)的信息。
    在java编写的每一个类中,生成的class中都包含了一个Class的类,保存有该类的信息。也称为ClassMeta类,原数据类。你可以想象系统中有这么一个原数据集合,可以用来在运行期来判定实际类型。Class类就是负责产生该类的实例的。产生的每一个实例,都包含有原数据类型的一个reference。所以class可以通过.class,实例可以通过getClass得到。java在程序启动的时候是不会装在全部的类的。当你要产生出一个实例的时候,java虚拟机会检查已经载入的类,如果有,就通过该Class产生一个新的实例,如果没有,就装载该类,然后在产生实例。java中RTTI的一个重要用途就是 安全的转型(downCast);大家都知道upcast是鼓励使用的一种机制,表现为多态。而在很多情况下面,我们不得不使用downCast,比如从容器中取出来的都是Object的,我们会将他们转化为需要的类型,如果与实际类型不符,就会抛出异常(系统级的)。
      

  17.   

    test.class是Class的一个实例,类里面的方法也是对象,看下jdk中reflect包吧
      

  18.   

    你要是用过ejb就知道了。.class得到实例。
      

  19.   

    advanced (超越) 结贴了~
      

  20.   

    Thinking in Java里边的RTTI一章有介绍的,其实就是产生一句柄。
      

  21.   

    呵呵,楼主光看了侯捷先生的深入浅出MFC,却没有看他翻译的TIJ...
      

  22.   

    我觉得星星代表的是参与和/或水平。水平高不参与也拿不到星星,相反水平不高积极参与却同样可以拿到星星,水平高且积极参与拿到星星自然快些多些。所以,我个人总是尊敬有星星的人。简单地说,RTTI就是运行时的类型识别。稍微具体点讲它就是在运行时对象的类型资料(比如类名、属性、成员函数等)。在编译的时候,编译器可以从原程序得到关于一个类的所有资料,如果这些资料不和编译后的目标码储存在一起,更准确地说是如果在目标码运行时无法取得这些资料,那么这个语言或编译器就不支持RTTI,反之就是支持RTTI。从纯OO的角度看,RTTI是元数据(meta-data)的一部份。最简单的RTTI就是给每个类赋值一个类号,运行时根据这个号码就可以知道是什么类,早期的C++不支持RTTI,所以程序员常自己用这种方法来保证down-cast的安全。JAVA是支持meta-data的(即它的reflection, 但不完全支持meta-class功能, 因为不能在运行时产生新的类也就是用Class类来产生新的类),所以它支持RTTI。所有的RTTI都会有一套访问其内容的方法,JAVA的getClass()和你例子中的class就是让你取得类名称的方法。据我很有限的JAVA知识,你的Test.class返回的是一个Class(meta-class, 元数据类)类的对象(代表的就是Test类,你可以通过它找到Test类的所有类型资料),Class类的toString()会返回类的名称。针对对象的getClass()也返回一个同样的对象。所有你可以通过类来取得对应的元数据类的对象,也可以通过对象来取得对应元数据类的对象。Meta-class的东西可能会让初学者糊涂,其实很简单,关键是明白什么是Class class。
    要全面了解RTTI,最好是从JAVA的reflection出发去全面掌握meta-class方面的知识。希望这些能给你一点帮助!
      

  23.   

    1.我终于找到了理论支持。首先感谢楼主提出的问题,我一直这样使用,也知道Test.class是class的对象,与new Test().getClass()返回的是同一对象。也知道动态加载的全部使用方法。但却没象楼主那样细心探讨Test.class用法的理论支持。其次感谢teva(用正确的理论引导人) ,指出了是java为支持RTTI而引入的。2.我在java.sun.com查找了相关文章。总结如下:
    a.RTTI:at run-time ,the type of an object is identified.就是在运行期,可以识别对象的类型。
    b.RTTI的历史渊源和基本理论如楼上所说。
    c.java为支持RTTI,给出了三种使用 class对象的方式。
      i.使用类java.lang.Class的方法:Class.forName(String className)
      ii.使用对象的getClass方法。
      iii.“using Java1.1 class literals" ,意思就是:程序代码的直接书写引用。
        就是我们的Test.class的写法。
       对于所有regular class,就是普通类,都可以这样用。对于基础类型,如boolean,int也可以这样使用。但对于包装类,如:Boolean,有特别说明,Boolean.class与boolean.class返回的是不同东西,因为他们本就不相同。但Boolean.TYPE可以引用到boolean.class。宗上所诉:Test.class的写法,是java 1.1开始的虚拟机的支持。不是从Object继承而来的。
     
      

  24.   

    首先感谢各位的回复。基本上我了解了一些java的RTTI方面的知识。但是说实话,我还是有点迷糊。主要是不了解java如何为每个类注册,如何在运行期间identify一个类。赶紧找TIJ来看呀。另外要说的一点是,某些版主级的人物自己觉得了不起,只会说一些没用的话显示自己水平高,不屑回答别人的问题。其实他的水平高么,不见得,其实你自己也弄不清其中的原理。我不会就是不会,我不会就要问,总比不懂装懂的好。这种人缺乏做版主的基本素质。