zoukankan      html  css  js  c++  java
  • java.lang.Class解析

    java.lang.Class

    1、java.lang.Class的概念

            当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,java.lang.class类就是用来封装被装入JVM中的类的信息。 JVM为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。

            Java的每个基本类型(boolean、byte、char、short、int、long、float 和 double)都有一个Class对象,数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。

    2、Class对象的获取

    有三种方法可以得到一个class对象

    2.1、调用Object类的getClass()方法来得到Class对象

    所有Java对象都具备这个方法,该方法返回调用该方法的对象所属类关联的Class对象

            Person person1 = new Person();
            Class c1 = person1.getClass();
            System.out.println(c1.getName());
            
            //再新建一个person的class对象,观察看看同一个类不同的对象生成的class对象是否相同 
            Person person2 = new Person();
            Class c2 = person2.getClass();
            System.out.println(c1==c2);
             // (1)结果发现返回true,说明对于相同的类,JVM只会载入一次,而与该类对应的Class对象也只会存在一个,无论该类实例化了多少对象。
            
            List list = new ArrayList();  
            System.out.println(list.getClass().getName()); 
            //  (2)结果发现返回java.util.ArrayList 说明当一个对象被其父类的引用或其实现的接口类型的引用所指向时,getClass方法返回的是与对象实际所属类关联的Class对象。

    2.2、 使用.class的方式

    对于一个JAVA类型,直接使用类名.class就可以得到一个class对象

            Class c3 = Person.class;
            Class c4 = int.class;
            Class c5 = int[].class;    
            System.out.println(c3.getName());            // 输出 com.pjf.Person
            System.out.println(c4.getName());            // 输出 int
            System.out.println(c5.getName());            // 输出 [I      注:可以看到数组返回奇怪的名字、
            System.out.println(c5.getComponentType());   //输出  int      这时候返回就正确了

    2.3使用Class类的中静态forName()方法

    使用Class类的中静态forName()方法获得与字符串对应的Class对象。

      Class c6=Class.forName("com.pjf.Person");
      System.out.println(c6.getName());

    3、java.lang.Class类的方法

       1、getName() 
        返回Class对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

        2、newInstance()

        Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:

        x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。

        3、getClassLoader() 

        返回该类的类加载器。

        4、getComponentType() 

        返回表示数组组件类型的 Class。

        5、getSuperclass() 

        返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

        6、isArray() 
        判定此 Class 对象是否表示一个数组类。

  • 相关阅读:
    「移动开发云端新模式探索实践」征文活动
    为数据赋能:腾讯TDSQL分布式金融级数据库前沿技术
    腾讯刘金明:腾讯云 EB 级对象存储架构深度剖析及实践
    腾讯冯宇彦:基于大数据与人工智能的智慧交通云
    腾讯毛华:智能交互,AI助力下的新生态
    腾讯聂晶:数据资产助力企业发展
    2018云+未来峰会圆桌面对面:以网络安全之能,造国之重器
    全景解析腾讯云安全:从八大领域输出全链路智慧安全能力
    为 “超级大脑”构建支撑能力,腾讯云聚焦AI技术落地
    web service介绍
  • 原文地址:https://www.cnblogs.com/pjfmeng/p/7602514.html
Copyright © 2011-2022 走看看