当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。因为使用了public修饰,所以我们可以采用如下的形式对其访问:  java.lang.Class c1 = String.class;既然如此,为什么下面的调用方式就不行了呢?  java.lang.Class c1 = new String("x").class;

解决方案 »

  1.   

    java.lang.Class c1 = new String("x").class;
    你new 的时候还没编译成.class文件,只有编译好了的才能用 这样用。
    你可以这样  java.lang.Class c1 = new String("x").getClass();效果一样哈
      

  2.   

    String.class这个是特殊用法,class并不是String的一个属性
      

  3.   

    我已经说了String.class是特殊用法,class并不是String中的一个属性,与MyClass.myField在指令中已经是不同的
    String.class在Class文件中指令是ldc_w #x  表示从常量池中获取出值并压栈,也就是获取出Class对象MyClass.myField指令是  getstatic    #x; 表示获取一个类的静态属性所以两者是根本不同的
      

  4.   

    至于new String("x").class;这个为什么不行,
    那是因为Java规定了只有Class.class才合法,
    obj.class不合法。因为obj所属的类并不能在编译时确定,所以需要使用obj.getClass();
      

  5.   

    回 ChDw ,您说的这些,我还是了解的不过对于这句话,是否赞成呢?当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。我也是在网上看到这句话的,也不知是否正确
      

  6.   

    Object.class
    这个class不是变量
    是java的特殊用法。
      

  7.   

    String  和new String("x")根本就是两不不同的东西,一个是类,一个是类实例化後的对象,
    你new的时候是实例化了这个类,一个实例化了的东西是不能直接用 .class来得到他的Class对象的,
    为什么不能?你就应该明白你返回的Class的实例实际上表示的是当前运行的Java应用程序中的类或者接口。
    理所当然,String.class就可以得到当前的String类,因为String是一个类,
    所以说我们要得到一个实例化後的对象的类,就必须这样 new String("x").getClass(),只有这样我们才能
    得到这个String类,你可利用另外一个方法test  System.out.println("test result is:  "+new String("x").getClass.getName());可以看下打印的是什么结果。
      

  8.   

    回guaxixi627 首先谢谢你的回复,不过我不认同你的看法的
    "一个实例化了的东西是不能直接用 .class来得到他的Class对象的",我问的是为什么,而不是结论本身
    即"当编译一个JAVA文件时,编译器都会在其字节码文件中嵌入一个被public, static, final修饰、类型为java.lang.Class、名称为class的域变量。"这句话,是否正确,错了的话又错在哪里?
    要知道,java在运行时,只与.class文件相关的,而与.java文件无关我的问题没有解决,按道理是可以作为 无满意结贴 的,但我还是结贴给了分,并感谢各位的回复!10天内结贴,好像不晚吧?
      

  9.   

    带着同样的问题看了以上回复后,我查阅了一下API文档,同时也进行了很多的测试而得出了以下结论,仅供参考
        [class_name].class所返回的是一个Class类的对象,这个对象是用来描述[class_name]这个类的一些性质的
        当你在eclipse中写上"[class_name].class."之后,出现的帮助信息中全是Class类中的方法
        一句话: .class所返回的是一个描述基础类的性质的实例,对象并不代表某个具体的类,所以不能用obj.class,即
     new String("*").class是不合法的