Class类入门

1. Class类简介

Java反射的源头是一个Class类,每一个类在内存中都有且只有一个Class对象。
在这里插入图片描述

java源文件经过编译后生成一个.class字节码文件,然后JVM虚拟机运行时是去加载.class字节码文件。JVM加载时会为每一个类创建一个Class类型的对象(Class本身也是一个类),一个Class对象包含了特定的某个结构(类 / 接口 / 枚举 / 注解 / 基础数据类型 / 空类型 / 数组 …)的有关信息。

  • Class本身也是一个类

  • Class对象只能由系统建立对象

  • 一个加载的类在JVM中只会有一个Class实例。

  • 一个Class对象对应的是一个加载到JVM的一个.class字节码文件

  • 每个类的实例都会记得自己是由哪个Class所产生的

  • 通过Class可以完整地得到一个类的所有被加载的结构

  • Class类是反射的根源,针对任何你想动态加载、运行的类,唯有限获得相应的Class对象。


2. Class类基本信息

  1. 首先定义三个基础类,Person、Student、Teacher类。

    class Person{
        private String name;
        public Person(){}
        
        public Person(String name) {
            this.name = name;
        }
    }
    class Student extends Person{
        public Student(){
            super("学生!");
        }
    
    }
    class Teacher extends Person{
        public Teacher(){
            super("教师!");
        }
    }
    
  2. 获取Class类的几种方式:通过实例化对象获取、类名.Class获取、反射获取,还可以利用类加载器获取。由于每一个类在内存中有且只有一个Class类对象,所以获取到的hashcode值都是一样的。

    @Test
    public void test1() throws Exception{
    
    //1. 实例化对象获取
        Person student = new Student();
        Class c1 = student.getClass();
        System.out.println(c1.hashCode());
    
    //2. 类名.Class
        Class c2 = Student.class;
        System.out.println(c2.hashCode());
    
    //3. 反射获取
        Class c3 = Class.forName("JVM.SevenClassLoader.Student");
        System.out.println(c3.hashCode());
        
        //4. 内置基本数据类型可以直接.TYPE
       	System.out.println(Integer.TYPE);
    
      		//5. 获取父类
           System.out.println(c2.getSuperclass());
    }
    

    在这里插入图片描述


  3. 所有类的Class类最后都来自同一个Class类型(Class本身也是一个类型)

    @Test
    public void test2(){
    	//1. java.lang.String类
        Class c1 = String.class.getClass();
        System.out.println(c1 + " = " + c1.hashCode());
        
        //2. Student类
        Class c2 = Student.class.getClass();
        System.out.println(c2 + " = " + c2.hashCode());
        
        //3. Teacher类 
        Class c3 = Teacher.class.getClass();
        System.out.println(c3 + " = " + c3.hashCode());
        
        //4. Person类
        Class c4 = Person.class.getClass();
        System.out.println(c4 + " = " + c4.hashCode());
    }
    

    在这里插入图片描述

  4. 获取所有常见类型的Class类对象

    @Test
    public void test3(){
        Class c1 = String.class;            //String
        Class c2 = Object.class;            //类
        Class c3 = int[].class;             //一位数组
        Class c4 = int[][].class;           //二维数组
        Class c5 = Comparable.class;        //接口
        Class c6 = Deprecated.class;        //注解
        Class c7 = ElementType.class;       //枚举
        Class c8 = void.class;              //void
        Class c9 = Class.class;             //Class
    
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
        System.out.println(c4);
        System.out.println(c5);
        System.out.println(c6);
        System.out.println(c7);
        System.out.println(c8);
        System.out.println(c9);
    }
    

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值