java中把生成Class对象和实例对象弄混了,更何况生成Class对象和生成instance都有多种方式。所以只有弄清其中的原理,才可以深入理解。首先要生成Class对象,然后再生成Instance。那Class对象的生成方式有哪些呢,以及其中是如何秘密生成的呢?

Class对象的生成方式如下:

1.Class.forName("类名字符串")  (注意:类名字符串必须是全称,包名+类名)

2.类名.class

3.实例对象.getClass()

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

[java] view plain copy

 

print?

  1. /**
  2. * 2012-2-6
  3. * Administrator
  4. */
  5. /**
  6. * @author: 梁焕月
  7. * 文件名:TestClass.java
  8. * 时间:2012-2-6上午10:01:52
  9. */
  10. public class TestClass {
  11. public  static void main(String[] args)
  12. {
  13. try {
  14. //测试Class.forName()
  15. Class testTypeForName=Class.forName("TestClassType");
  16. System.out.println("testForName---"+testTypeForName);
  17. //测试类名.class
  18. Class testTypeClass=TestClassType.class;
  19. System.out.println("testTypeClass---"+testTypeClass);
  20. //测试Object.getClass()
  21. TestClassType testGetClass= new TestClassType();
  22. System.out.println("testGetClass---"+testGetClass.getClass());
  23. } catch (ClassNotFoundException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. class TestClassType{
  30. //构造函数
  31. public TestClassType(){
  32. System.out.println("----构造函数---");
  33. }
  34. //静态的参数初始化
  35. static{
  36. System.out.println("---静态的参数初始化---");
  37. }
  38. //非静态的参数初始化
  39. {
  40. System.out.println("----非静态的参数初始化---");
  41. }
  42. }

测试的结果如下:

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

testForName---class TestClassType

testTypeClass---class TestClassType

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

----构造函数---

testGetClass---class TestClassType

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

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

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

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

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

原文地址

java中Class对象详解的更多相关文章

  1. java中Class对象详解和类名.class, class.forName(), getClass()区别

    一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到Java的反射----- Java反射学习 所谓反射,可以 ...

  2. 【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别

    Class对象的生成方式如下: 1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...

  3. Java中日志组件详解

    avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...

  4. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  5. java中的注解详解和自定义注解

    一.java中的注解详解 1.什么是注解 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override public Str ...

  6. Java中dimension类详解

    Java中dimension类详解 https://blog.csdn.net/hrw1234567890/article/details/81217788

  7. [转载]java中import作用详解

    [转载]java中import作用详解 来源: https://blog.csdn.net/qq_25665807/article/details/74747868 这篇博客讲的真的很清楚,这个作者很 ...

  8. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

  9. Java并发编程(十一)-- Java中的锁详解

    上一章我们已经简要的介绍了Java中的一些锁,本章我们就详细的来说说这些锁. synchronized锁 synchronized锁是什么? synchronized是Java的一个关键字,它能够将代 ...

随机推荐

  1. Chapter 16_5 单一方法

    当一个对象只有一个方法时,可以不用创建接口table,但是要将这个单独的方法作为对象来返回.可以参考迭代器那一节,是如何构造一个迭代器函数,那个函数将状态保存为closure. 一个具有状态的迭代器是 ...

  2. ansible role 执行顺序

    the dependencies of the 'openshift-master' role.- docker- openshif_common  - os_firewall   - openshi ...

  3. Java版冒泡排序和选择排序

    一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...

  4. APP金融安全白皮书十大安全注意事项及各项注意安全

    1 信息数据明文发送 2 通信数据可破解 3 敏感数据本地可破解 4 调试信息泄漏 5 敏感信息泄漏 6 密码学误用 7 功能泄漏 8 可二次打包 9 可调式 10 代码可逆向 ----------- ...

  5. Maven手动增加依赖jar到本地Maven仓库中

    Apache Maven是一个项目管理及自动构建工具,有APache软件基金会提供.我们只要配置成功后就可以通过配置pom.xml添加所需依赖的jar包和类库,因为这些类库已经在我们配置的Maven仓 ...

  6. border表格有的自动换行,有的不能自动换行!

    解决手机端tab超过设置的宽度换行! <table id="vip-tab"> <tr id="leibie"> <th clas ...

  7. JavaScript DOM编程艺术-学习笔记(第七章)

    第七章: 1.dom方法创建并且插入标签:(这种方法并没有改变文档的物理内容,而是在改变dom树) ①创建元素节点:createElement(); ②内部前插入:appendChild() ③创建文 ...

  8. HDU 5829 Rikka with Subset

    快速数论变换ntt. 早上才刚刚接触了一下FFT,然后就开始撸这题了,所以要详细地记录一下. 看了这篇巨巨的博客才慢慢领会的:http://blog.csdn.net/cqu_hyx/article/ ...

  9. css3制作导航栏

    <!doctype html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  10. dplyr 数据操作 数据排序 (arrange)

    在R中,我们在整理数据时,经常需要对数据排序,以便数据增强数据的可读性. 下面我们来看下dplyr中的,arrange函数 arrange(.data, ...) 跟filter()类似,arrang ...