java.lang.Class

     刚接触反射机制的时候,记得有这么句话,叫做所有的类都是Class的实例,这个Class是Java.lang.Class。当时很不理解,我能明白    Student student=new Student( ), student是Student类的实例,怎么会Student类是Class类的实例呢?
     今天看书的时候,读到了JVM的内容,我才恍然大悟。
     首先,从JDK官方文档找到了Class的一些介绍:
     

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(booleanbytecharshortintlongfloat 和 double)和关键字 void也表示为 Class 对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

以下示例使用 Class 对象来显示对象的类名:

     void printClassName(Object obj) {
         System.out.println("The class of " + obj +
                            " is " + obj.getClass().getName());
     }
 

还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class 对象。例如:

     System.out.println("The name of class Foo is: "+Foo.class.getName());
          这些内容明确了那句话,所有类都是Class类的实例,当然,要加上正在运行这句话。
 
     接下来,讲讲我的学习心得:
     1:JVM
     JVM就是java虚拟机,实现了Java跨平台的功能。我们能体会到的实现过程是 :  .java -> .class -> JVM 。 我们写好的Java程序会保存在一个.java结尾的文件中,然后经过编译器编译成字节码文件,也就是以.class结尾的文件,接下来会有classLoader 类加载器 把这个字节码文件加载到JVM上。
     不多解释JVM是怎么和实体机进行工作的,在这里就把JVM看成实体机,上面的过程就是我们的java语言转到JVM能够理解的字节码语言的过程。那么 在JVM上存的当然不是我们的.java文件 java 类 了,存的是.class  好多.class。
     2:Java类
     假设有Student类,面向对象编程嘛,就说有学生这个群体,好多学生,我们可以把他们写成一个类,Student。然后有个学生,比如说叫ZhangSan,ZhangSan是具体的对象,所以我们可以这样做 
          Student ZhangSan=new Student( ); 
     这个很好理解吧,ZhangSan是Student类的实例。
     3:
     把上面二者结合来看,学生很多,我们可以抽象成Student类,但是在JVM中,.class也很多,我们怎么办?当然 我们什么都不用干,因为已经有了java.lang.Class,我个人理解,这个Class类就是.class的抽象。从Java文件的角度考虑,你写的每一个类 不外乎就是方法 属性等这些东西,既然有共性,就是可以抽象的。
     ZhangSan是Student类的实例,是广义的Student的具体实现。那JVM有了好多的class,Student就是广义的Class的具体实现。
     
     从其他博文中我看到了这两句话
      反射机制的作用:
                   1,反编译:.class-->.java
                   2,通过反射机制访问java对象的属性,方法,构造方法等;
     我觉得理解了Class 类的实例表示正在运行的 Java 应用程序中的类和接口( Instances of the class Class represent classes and interfaces in a running Java application)这句话,反射机制就不是那么难理解了。
  
 
     
原文地址:https://www.cnblogs.com/zhao307/p/5405491.html