浅谈java中类名.class, class.forName(), getClass()的区别

 更新时间:2017年05月18日 07:37:02   投稿:jingxian  
下面小编就为大家带来一篇浅谈java中类名.class, class.forName(), getClass()的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Class对象的生成方式如下:

1、类名.class   

说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象

2、Class.forName("类名字符串")  (注:类名字符串是包名+类名) 

说明:装入类,并做类的静态初始化,返回Class的对象

3、实例对象.getClass() 

说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象

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

public class TestClass {
public static void main(String[] args)
{

try {
//测试.class

Class testTypeClass=TestClassType.class;

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


//测试Class.forName()

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

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


//测试Object.getClass()

TestClassType testTypeGetClass= new TestClassType();

System.out.println("testTypeGetClass---"+testTypeGetClass.getClass());

 

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}
}

}

 class TestClassType{

//构造函数

public TestClassType(){

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

}

//静态的参数初始化

static{

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

}

//非静态的参数初始化

{

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

}    

}

测试的结果如下:

testTypeClass---class TestClassType

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

testTypeForName---class TestClassType

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

----构造函数---

testTypeGetClass---class TestClassType

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

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

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

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

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

以上这篇浅谈java中类名.class, class.forName(), getClass()的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Security 强制退出指定用户的方法

    Spring Security 强制退出指定用户的方法

    本篇文章主要介绍了Spring Security 强制退出指定用户的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java Jackson之ObjectMapper常用用法总结

    Java Jackson之ObjectMapper常用用法总结

    这篇文章主要给大家介绍了关于Java Jackson之ObjectMapper常用用法的相关资料,ObjectMapper是一个Java库,用于将JSON字符串转换为Java对象或将Java对象转换为JSON字符串,需要的朋友可以参考下
    2024-01-01
  • SpringBoot获取http数据、打印HTTP参数的4种方式

    SpringBoot获取http数据、打印HTTP参数的4种方式

    Java的话本地打断点可以调试获取rest入参,但是在生产环境可能我们获取入参(Http header/parameter)可能就没有那么的轻松了,所以本文给大家介绍了SpringBoot获取http数据、打印HTTP参数的4种方式,需要的朋友可以参考下
    2024-03-03
  • Spring Boot简单实现文件上传功能

    Spring Boot简单实现文件上传功能

    这篇文章主要介绍了Spring Boot简单实现文件上传功能,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • struts2自定义拦截器的示例代码

    struts2自定义拦截器的示例代码

    本篇文章主要介绍了struts2自定义拦截器的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • minio的下载和springboot整合minio使用方法

    minio的下载和springboot整合minio使用方法

    本文介绍了如何通过Docker拉取MinIO镜像,并创建MinIO容器的过程,首先,需要在本地创建/data和/conf两个目录用于挂载MinIO的数据和配置文件,接下来,通过docker run命令启动容器,设置MinIO的访问端口、用户名、密码等信息,感兴趣的朋友一起看看吧
    2024-09-09
  • 利用Java理解sql的语法(实例讲解)

    利用Java理解sql的语法(实例讲解)

    下面小编就为大家分享一篇利用Java理解sql的语法(实例讲解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • idea使用easyCode生成代码(根据mybatis-plus模板创建自己的模板)

    idea使用easyCode生成代码(根据mybatis-plus模板创建自己的模板)

    本文主要介绍了idea使用easyCode生成代码,easyCode代码生成器可以减少低价值搬砖,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 详解springboot整合ehcache实现缓存机制

    详解springboot整合ehcache实现缓存机制

    这篇文章主要介绍了详解springboot整合ehcache实现缓存机制,ehcache提供了多种缓存策略,主要分为内存和磁盘两级,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 普通类注入不进spring bean的解决方法

    普通类注入不进spring bean的解决方法

    这篇文章主要介绍了普通类注入不进spring bean的解决方法,帮助大家更好的理解和使用spring bean,感兴趣的朋友可以了解下
    2021-01-01

最新评论