在java反射中,我们可以通过 "类名.class" 得到这个某个类的Class实例.
但是一直不了解,为什么可以直接通过类名来方位class属性?我的理解:
   在java中只有static方法和属性可以直接被类名访问,但是我们任意定义一个类,都可以调用 类名.class 
   举例如下:
      
      public class User {
private int id;
private String name;         .......getter setter.........
      }
    以上自定义类User没有继承任何一个类,我也没有定义"static class"属性,同时Object类也没有这个属性.
    
    但是我依然可以测试调用如下:
    
     public static void main(String[] args){
         System.out.println(User.class.getName());
     }
    
     总结: 为什么可以调用User.class, .class 哪里来的????

解决方案 »

  1.   

    class是由JVM编译过来让java中能够识别的 ,那个class  其实就是你的IDE  自动编译出来的 
        如果你手写的话还要自己手动编译
      

  2.   

    “Class”类    众所周知Java有个Object 类,是所有Java classes的继承根源,其内声明了数个应该在所有Java class中被改写的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class object。     Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class object。   
    “Class” object的取得途径 Java允许我们从多种管道为一个class生成对应的Class object。下图是一份整理。 
    Class object 诞生管道 示例 运用getClass() 注:每个class 都有此函数 String str = "abc"; Class c1 = str.getClass(); 运用 Class.getSuperclass() Button b = new Button(); Class c1 = b.getClass(); Class c2 = c1.getSuperclass(); 运用static method Class.forName() (最常被使用) Class c1 = Class.forName ("java.lang.String"); Class c2 = Class.forName ("java.awt.Button"); Class c3 = Class.forName ("java.util.LinkedList$Entry"); Class c4 = Class.forName ("I"); 运用 .class 语法 Class c1 = String.class; Class c2 = java.awt.Button.class; Class c3 = Main.InnerClass.class; Class c4 = int.class; Class c5 = int[].class; 运用 primitive wrapper classes 的TYPE 语法 
    Class c1 = Boolean.TYPE; Class c2 = Byte.TYPE; Class c3 = Character.TYPE; Class c4 = Short.TYPE; Class c5 = Integer.TYPE; Class c6 = Long.TYPE; Class c7 = Float.TYPE; Class c8 = Double.TYPE; Class c9 = Void.TYPE; 
      

  3.   

    类名.class是Class对象的句柄
    每个被加载的类,在jvm中都会有一个Class对象与之相对应,可以理解为每个类都有一个static属性的Class类实例
    如果要创建新的对象,直接使用Class对象的局部class.forName就可以了
      

  4.   


    这个深一点研究就要看JDK是怎么实现的了
      

  5.   


    我把JDK源码引入也没有找到.class这个,所以就很不解!
      

  6.   


    我把这个看成SUN公司设计JAVA语言时的定义的一个规范,开发JDK时,按这个规范去实现的,就是你现在看到的。
      

  7.   

    具体怎么就 类名.class是Class对象的句柄了 我也不知道怎么回事 
      

  8.   


    感觉应该是ClassLoader加载的时候,自动生成的".class"的静态属性.
    但是找不到依据,看看还有没有人注意过这个问题.
      

  9.   

    楼主研究的好深入,可以去深入了解下JVM的运行机制。
      

  10.   

    在cmd中运行你的User.java 它不是会生成User.class么
    然后你调用的User.class就是这个啊
    System.out.println(User.class.getName())不就是调用自身得方法么?