博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中Class对象详解
阅读量:5012 次
发布时间:2019-06-12

本文共 2005 字,大约阅读时间需要 6 分钟。

原出处:

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

Class对象的生成方式如下:

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

2.类名.class

3.实例对象.getClass()

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

1 package com.gxf.rtti; 2  3 public class TestClass { 4     public static void main(String[] args) { 5         try { 6             Class testForName = Class.forName("com.gxf.rtti.TestClassType"); 7             System.out.println("testForName---" + testForName); 8             Class testTypeClass = TestClassType.class; 9             System.out.println("testTypeClass---" + testTypeClass);10             TestClassType testClassType = new TestClassType();11             Class testGetClass = testClassType.getClass();12             System.out.println("testGetClass---" + testGetClass);13             14             System.out.println(testForName == testTypeClass && testForName == testGetClass);15         } catch (ClassNotFoundException e) {16             // TODO Auto-generated catch block17             e.printStackTrace();18         }19 20     }21 }22 class TestClassType{23     static{24         System.out.println("--------静态参数初始化--------");25     }26     public TestClassType(){27         System.out.println("--------构造函数---------");28     }29     {30         System.out.println("---------非静态参数初始化-----------");31     }32 }

output:

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

testForName---class com.gxf.rtti.TestClassType
testTypeClass---class com.gxf.rtti.TestClassType
---------非静态参数初始化-----------
--------构造函数---------
testGetClass---class com.gxf.rtti.TestClassType
true

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

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

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

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

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

转载于:https://www.cnblogs.com/luckygxf/p/4241669.html

你可能感兴趣的文章
SGU438_The Glorious Karlutka River =)
查看>>
Linux集群及LVS简介
查看>>
简单几何(直线与圆的交点) ZOJ Collision 3728
查看>>
Codeforces Round #327 (Div. 2)
查看>>
如何解决Provisional headers are shown问题(转)
查看>>
开发网站遇到的bug
查看>>
实现简单的接口自动化测试平台
查看>>
EXCEL工作表合并
查看>>
Prime Path
查看>>
ODAC(V9.5.15) 学习笔记(三)TOraSession(2)
查看>>
sqlyog 安装使用
查看>>
单纯形法
查看>>
SQL中的replace函数
查看>>
java中的类型安全问题-Type safety: Unchecked cast from Object to ...
查看>>
如何解决最后一个尾注引用显示与致谢混为一谈的问题-下
查看>>
Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...
查看>>
阅读之https及加密原理
查看>>
HDOJ4550 卡片游戏 随便销毁内存的代价就是wa//string类的一些用法
查看>>
css文本样式text、字体样式font
查看>>
洛谷 P1020 导弹拦截(LIS)
查看>>