Java语言class类用法及泛化(详解)

 更新时间:2015年07月28日 10:11:05   作者:道德楷模周鸿祎  
这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象今夕类型标识,也就是RTTI。这项信息记录了每个对象所属的类,需要的朋友可以参考下

这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI。这项信息记录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建,具体内容介绍如下:

说白了就是:

Class类也是类的一种,只是名字和class关键字高度相似。Java是大小写敏感的语言。
Class类的对象内容是你创建的类的类型信息,比如你创建一个shapes类,那么,Java会生成一个内容是shapes的Class类的对象
Class类的对象不能像普通类一样,以 new shapes() 的方式创建,它的对象只能由JVM创建,因为这个类没有public构造函数
Class类的作用是运行时提供或获得某个对象的类型信息,和C++中的typeid()函数类似。这些信息也可用于反射。

1.Class类原理

我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象。我们自己无法生成一个Class对象(构造函数为private),而 这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。我们生成的对象都会有个字段记录该对象所属类在CLass类的对象的所在位置。如下图所示:

2.获得一个Class类对象

第一种办法,Class类的forName函数

复制代码 代码如下:

public class shapes{} 
Class obj= Class.forName("shapes");

第二种办法,使用对象的getClass()函数

复制代码 代码如下:

public class shapes{}
shapes s1=new shapes();
Class obj=s1.getClass();
Class obj1=s1.getSuperclass();//这个函数作用是获取shapes类的父类的类型

第三种办法,使用类字面常量

复制代码 代码如下:

Class obj=String.class;
Class obj1=int.class;

注意,使用这种办法生成Class类对象时,不会使JVM自动加载该类(如String类)。而其他办法会使得JVM初始化该类。

3.使用Class类的对象来生成目标类的实例

生成不精确的object实例

获取一个Class类的对象后,可以用 newInstance() 函数来生成目标类的一个实例。然而,该函数并不能直接生成目标类的实例,只能生成object类的实例

复制代码 代码如下:

Class obj=Class.forName("shapes");
Object ShapesInstance=obj.newInstance();

使用泛化Class引用生成带类型的目标实例

复制代码 代码如下:

Class<shapes> obj=shapes.class;
shapes newShape=obj.newInstance();

因为有了类型限制,所以使用泛化Class语法的对象引用不能指向别的类。

复制代码 代码如下:

Class obj1=int.class;
Class<Integer> obj2=int.class;
obj1=double.class;
//obj2=double.class;

这一行代码是非法的,obj2不能改指向别的类了
然而,有个灵活的用法,使得你可以用Class的对象指向基类的任何子类。

复制代码 代码如下:

Class<? extends Number> obj=int.class;
obj=Number.class;
obj=double.class;

因此,以下语法生成的Class对象可以指向任何类。

复制代码 代码如下:

Class<?> obj=int.class;
obj=double.class;
obj=shapes.class;

最后一个奇怪的用法是,当你使用这种泛型语法来构建你手头有的一个Class类的对象的基类对象时,必须采用以下的特殊语法

复制代码 代码如下:

public class shapes{}
class round extends shapes{}
Class<round> rclass=round.class;
Class<? super round> sclass= rclass.getSuperClass();
//Class<shapes> sclass=rclass.getSuperClass();


在这里需要大家注意:明知道round的基类就是shapes,但是却不能直接声明 Class < shapes >,必须使用特殊语法Class < ? super round >

以上内容介绍就是针对Java语言class类用法及泛化(详解)全部内容,希望大家喜欢以上内容介绍。

相关文章

  • mybatis-plus的SafetyEncryptProcessor安全加密处理示例解析

    mybatis-plus的SafetyEncryptProcessor安全加密处理示例解析

    这篇文章主要为大家介绍了mybatis-plus的SafetyEncryptProcessor安全加密处理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SpringBoot自动重启、热启动方式

    SpringBoot自动重启、热启动方式

    这篇文章主要介绍了SpringBoot自动重启、热启动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Springboot2.6.x的启动流程与自动配置详解

    Springboot2.6.x的启动流程与自动配置详解

    这篇文章主要给大家介绍了关于Springboot2.6.x的启动流程与自动配置的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • JavaEE线程安全定时器模式任务

    JavaEE线程安全定时器模式任务

    这篇文章主要介绍了JavaEE线程安全定时器模式任务,定时器模式像是一个闹钟定时,在一定时间之后被唤醒并执行某个之前设定好的任务,感兴趣的小伙伴可以参考一下
    2022-06-06
  • jmeter正则表达式提取器的用法与正则详解

    jmeter正则表达式提取器的用法与正则详解

    在使用Jmeter过程中,会经常使用到正则表达式提取器提取器,下面这篇文章主要给大家介绍了关于jmeter正则表达式提取器的用法与正则的相关资料,需要的朋友可以参考下
    2022-07-07
  • SpringBoot jackson 精度处理问题解决

    SpringBoot jackson 精度处理问题解决

    由于JavaScript处理的最大数值限制,较大的雪花ID在JS中容易溢出,为解决此问题,可在SpringMVC或SpringBoot中使用@RequestBody注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • springboot使用IDEA远程Debug

    springboot使用IDEA远程Debug

    项目上线之后,如果日志打印的很模糊或者业务逻辑比较复杂,有时候无法定位具体的错误原因,因此可以通过IDEA远程代理进行Debug,本文就来介绍一下如何使用
    2021-06-06
  • java编程abstract类和方法详解

    java编程abstract类和方法详解

    这篇文章主要介绍了java编程abstract类和方法详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringBoot 2.6.x整合springfox 3.0报错问题及解决方案

    SpringBoot 2.6.x整合springfox 3.0报错问题及解决方案

    这篇文章主要介绍了SpringBoot 2.6.x整合springfox 3.0报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot2.2.X用Freemarker出现404的解决

    SpringBoot2.2.X用Freemarker出现404的解决

    这篇文章主要介绍了SpringBoot2.2.X用Freemarker出现404的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论