Class类特点和方法

举报
荞慧子 发表于 2022/12/31 19:54:40 2022/12/31
【摘要】 Class类介绍(1)Class也是类,因此也要继承Object类(2)Class类对象不是new出来的,而是系统创建的(3)对于某个类的Class类对象,在内存中只有一份,因为类只加载一次(4)每个类的实例都会记得自己是由哪个Class实例所生成的(5)通过Class对象可以完整的得到一个类的完整结构,通过一系列API(6)Class对象是存放在堆的(7)类的字节码二进制数据,是放在方法区...

Class类

介绍

(1)Class也是类,因此也要继承Object类

(2)Class类对象不是new出来的,而是系统创建的

(3)对于某个类的Class类对象,在内存中只有一份,因为类只加载一次

(4)每个类的实例都会记得自己是由哪个Class实例所生成的

(5)通过Class对象可以完整的得到一个类的完整结构,通过一系列API

(6)Class对象是存放在堆的

(7)类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等)

对Class类特点的梳理

import com.hspedu.Cat;
import java.util.ArrayList;

public class Class01 {
    public static void main(String[] args) throws ClassNotFoundException {
        
        //1. Class 也是类,因此也继承 Object 类
        //2. Class 类对象不是 new 出来的,而是系统创建的
        //(1) 传统 new 对象
        /* ClassLoader 类
            public Class<?> loadClass(String name) throws ClassNotFoundException {
                return loadClass(name, false);
            }
        */
        //Cat cat = new Cat();
        //(2) 反射方式, 刚才老师没有 debug 到 ClassLoader 类的 loadClass, 原因是,我没有注销 Cat cat = new Cat();
        /*
            ClassLoader 类, 仍然是通过 ClassLoader 类加载 Cat 类的 Class 对象
            public Class<?> loadClass(String name) throws ClassNotFoundException {
                return loadClass(name, false);
            }
        */
        Class cls1 = Class.forName("com.hspedu.Cat");
        //3. 对于某个类的 Class 类对象,在内存中只有一份,因为类只加载一次
        Class cls2 = Class.forName("com.hspedu.Cat");
        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        Class cls3 = Class.forName("com.hspedu.Dog");
        System.out.println(cls3.hashCode());
    }
}

Class类常用方法案例

import com.hspedu.Car;
import java.lang.reflect.Field;

public class Class02 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        String classAllPath = "com.hspedu.Car";
        
        //1 . 获取到 Car 类 对应的 Class 对象
        //<?> 表示不确定的 Java 类型
        Class<?> cls = Class.forName(classAllPath);
        
        //2. 输出 cls
        System.out.println(cls); //显示 cls 对象, 是哪个类的 Class 对象 com.hspedu.Car
        System.out.println(cls.getClass());//输出 cls 运行类型 java.lang.Class
        
        //3. 得到包名
        System.out.println(cls.getPackage().getName());//包名
        
        //4. 得到全类名
        System.out.println(cls.getName());
        
        //5. 通过 cls 创建对象实例
        Car car = (Car) cls.newInstance();
        System.out.println(car);//car.toString()
        
        //6. 通过反射获取属性 brand
        Field brand = cls.getField("brand");
        System.out.println(brand.get(car));//宝马
        
        //7. 通过反射给属性赋值
        brand.set(car, "奔驰");
        System.out.println(brand.get(car));//奔驰
        
        //8 我希望大家可以得到所有的属性(字段)
        System.out.println("=======所有的字段属性====");
        Field[] fields = cls.getFields();
        for (Field f : fields) {
            System.out.println(f.getName());//名称
        }
    }
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。