文档章节

[转载](转载)java中的Class类与Class对象

x
 xiaoxiao803
发布于 2016/04/18 16:17
字数 822
阅读 15
收藏 0

转自:http://blog.sina.com.cn/s/blog_76ecd078010178pe.html 


Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
    Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 
    虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
    基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。 
    每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
    一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

    Class对象的生成方式如下:

        1.Class.forName("类名字符串")

        2.类名.class

        3.实例对象.getClass()

    通过一段小程序,来观察一下Class对象的生成的原理。

 

  1.   

  2.   

  3.   

  4.   

  5. public class TestClass {  

  6.   

  7.    

  8.   

  9. public  static void main(String[] args)  

  10.   

  11. {  

  12.   

  13. try {  

  14.   

  15. //测试Class.forName()  

  16.   

  17. Class testTypeForName=Class.forName("TestClassType");          

  18.   

  19. System.out.println("testForName---"+testTypeForName);  

  20.   

  21. //测试类名.class  

  22.   

  23. Class testTypeClass=TestClassType.class;  

  24.   

  25. System.out.println("testTypeClass---"+testTypeClass);  

  26.   

  27. //测试Object.getClass()  

  28.   

  29. TestClassType testGetClass= new TestClassType();  

  30.   

  31. System.out.println("testGetClass---"+testGetClass.getClass());  

  32.   

  33.    

  34.   

  35. catch (ClassNotFoundException e) {  

  36.   

  37. // TODO Auto-generated catch block  

  38.   

  39. e.printStackTrace();  

  40.   

  41. }  

  42.   

  43.    

  44.   

  45. }  

  46.   

  47. }  

  48.   

  49.  class TestClassType{  

  50.   

  51. //构造函数  

  52.   

  53. public TestClassType(){  

  54.   

  55. System.out.println("----构造函数---");  

  56.   

  57. }  

  58.   

  59. //静态的参数初始化  

  60.   

  61. static{  

  62.   

  63. System.out.println("---静态的参数初始化---");  

  64.   

  65. }  

  66.   

  67. //非静态的参数初始化  

  68.   

  69. {  

  70.   

  71. System.out.println("----非静态的参数初始化---");  

  72.   

  73. }          

  74.   

  75. }  

    测试的结果如下:

---静态的参数初始化---

testForName---class TestClassType

testTypeClass---class TestClassType

----非静态的参数初始化---

----构造函数---

testGetClass---class TestClassType

    根据结果可以发现,三种生成的Class对象一样的。并且三种生成Class对象只打印一次“静态的参数初始化”。

    我们知道,静态的方法属性初始化,是在加载类的时候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。

    因此,这段程序说明,三种方式生成Class对象,其实只有一个Class对象。在生成Class对象的时候,首先判断内存中是否已经加载。 

    所以,生成Class对象的过程其实是如此的:

    当我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。


本文转载自:

共有 人打赏支持
x
粉丝 1
博文 87
码字总数 1437
作品 0
海淀
Java中Class对象的生成方式

2012-2-6 Administrator @author: 梁焕月 文件名:TestClass.java 时间:2012-2-6上午10:01:52 class TestClassType{ //静态的参数初始化 //非静态的参数初始化...

cookqq
2012/03/17
0
0
[转载]java里抽象类和接口的区别

下面的这篇文章讲的十分透彻了,所以转载之 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstrac...

曾赛
2009/08/17
0
0
java的反射和它的类加载机制

java 的类装载系统: 在java虚拟机中有两种类装载器: 启动类装载器 和 自定义类装载器。 前者是jvm的一部分,后者是java程序的一部分。不同的类装载器放在不懂得命名空间中。 类转载子系统涉...

Richard_sun
2013/01/18
0
0
Java如何快速获取类附带的注解

作者: 一字马胡 转载标志 【2018-01-04】 更新日志 Java技术干货分享 如何快速获取或者判断一个类是否有某个注解呢?可以使用对象的Class信息来获取,下面是一个例子: 在上面的例子中,has...

疼丸李白
01/04
0
0
java语言反射的概述以及三种获取字节码文件对应的Class类型的对象的方式

反射的概述:   JAVA反射机制是在运行状态中,   对于任意一个类,都能够知道这个类的所有属性和方法(动态获取的信息);   对于任意一个对象,都能够调用它的任意一个方法和属性(动态调...

黑泽明军
04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringCloud SpringBoot mybatis分布式Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用...

itcloud
5分钟前
0
0
c++ std::bind和std::function

定义于头文件 <functional> std::bind 函数绑定,https://zh.cppreference.com/w/cpp/utility/functional/bind // bind 用例#include <iostream>#include <functional> // 自定义的一......

SibylY
7分钟前
0
0
SecureCRT的安装与破解(过程很详细!!!)

SecureCRT的安装与破解(过程很详细!!!) SecureCRT的安装与破解(过程很详细!!!) 使用SecureCRT可以方便用户在windows环境下对linux主机进行管理,这里为大家讲一下SecureCRT的破解方...

DemonsI
12分钟前
0
0
介绍几款可用的web应用防火墙

目前有两款,基于软件和基于应用程序的web应用防火墙。基于软件的产品布置在Web服务器上,而基于应用程序的产品放置在Web服务器和互联网接口之间。两种类型的防火墙都会在数据传入和传出web...

上树的熊
18分钟前
0
0
用Visual Studio开发以太坊智能合约

区块链和以太坊 自从我熟悉区块链、以太坊和智能合约以来,一直失眠。 我一直在阅读,阅读和阅读,最后我能够使用一些工具,他们建议使用以太坊网站官方客户端应用程序(Ethereum Wallet)也...

geek12345
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部