Class类

news2024/10/7 1:22:22
  1. package com.hspedu.reflection.class_;
    
    import com.hspedu.Cat;
    
    import java.util.ArrayList;
    
    /**
     * @author 韩顺平
     * @version 1.0
     * 对Class类特点的梳理
     */
    public class Class01 {
        public static void main(String[] args) throws ClassNotFoundException {
            //看看Class类图
            //1. Class也是类,因此也继承Object类
            //Class
            //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());//这两个值一样
            //Cat类对应一个Class对象
            //Dog类对应一个Class对象
            System.out.println(cls2.hashCode());
            Class cls3 = Class.forName("com.hspedu.Dog");
            System.out.println(cls3.hashCode());
    
            
    
        }
    }
    
  2. Class类的常用方法

    package com.hspedu.reflection.class_;
    
    import com.hspedu.Car;
    
    import java.lang.reflect.Field;
    
    /**
     * @author 韩顺平
     * @version 1.0
     * 演示Class类的常用方法
     */
    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());//名称
            }
    
    
        }
    }
    

    通过反射获取属性值和传统方式是相反的brand.get(car)。传统car.brand

  3. 获取Class类对象

    package com.hspedu.reflection.class_;
    
    import com.hspedu.Car;
    
    /**
     * @author 韩顺平
     * @version 1.0
     * 演示得到Class对象的各种方式(6)
     */
    public class GetClass_ {
        public static void main(String[] args) throws ClassNotFoundException {
    
            //1. Class.forName
            String classAllPath = "com.hspedu.Car"; //通过读取配置文件获取
            Class<?> cls1 = Class.forName(classAllPath);
            System.out.println(cls1);
    
            //2. 类名.class , 应用场景: 用于参数传递
            Class cls2 = Car.class;
            System.out.println(cls2);
    
            //3. 对象.getClass(), 应用场景,有对象实例
            Car car = new Car();
            Class cls3 = car.getClass();//运行类型
            System.out.println(cls3);
    
            //4. 通过类加载器【4种】来获取到类的Class对象
            //(1)先得到类加载器 car
            ClassLoader classLoader = car.getClass().getClassLoader();
            //(2)通过类加载器得到Class对象
            Class cls4 = classLoader.loadClass(classAllPath);
            System.out.println(cls4);
    
            //cls1 , cls2 , cls3 , cls4 其实是同一个对象
            System.out.println(cls1.hashCode());
            System.out.println(cls2.hashCode());
            System.out.println(cls3.hashCode());
            System.out.println(cls4.hashCode());
    
            //5. 基本数据(int, char,boolean,float,double,byte,long,short) 按如下方式得到Class类对象
            Class<Integer> integerClass = int.class;
            Class<Character> characterClass = char.class;
            Class<Boolean> booleanClass = boolean.class;
            System.out.println(integerClass);//int
    
            //6. 基本数据类型对应的包装类,可以通过 .TYPE 得到Class类对象
            Class<Integer> type1 = Integer.TYPE;
            Class<Character> type2 = Character.TYPE; //其它包装类BOOLEAN, DOUBLE, LONG,BYTE等待
            System.out.println(type1);
    
            System.out.println(integerClass.hashCode());//同一个
            System.out.println(type1.hashCode());//同一个
    
    
    
    
        }
    }
    
  4. 哪些类型有Class对象

     

    package com.hspedu.reflection.class_;
    
    import java.io.Serializable;
    
    /**
     * @author 韩顺平
     * @version 1.0
     * 演示哪些类型有Class对象
     */
    public class AllTypeClass {
        public static void main(String[] args) {
    
            Class<String> cls1 = String.class;//外部类
            Class<Serializable> cls2 = Serializable.class;//接口
            Class<Integer[]> cls3 = Integer[].class;//数组
            Class<float[][]> cls4 = float[][].class;//二维数组
            Class<Deprecated> cls5 = Deprecated.class;//注解
            //枚举
            Class<Thread.State> cls6 = Thread.State.class;
            Class<Long> cls7 = long.class;//基本数据类型
            Class<Void> cls8 = void.class;//void数据类型
            Class<Class> cls9 = Class.class;//
    
            System.out.println(cls1);
            System.out.println(cls2);
            System.out.println(cls3);
            System.out.println(cls4);
            System.out.println(cls5);
            System.out.println(cls6);
            System.out.println(cls7);
            System.out.println(cls8);
            System.out.println(cls9);
        }
    }
    
  5. java动态加载,静态加载

     

  6. 类加载流程图

     

     

     

     

    package com.hspedu.reflection.classload_;
    
    /**
     * @author 韩顺平
     * @version 1.0
     * 我们说明一个类加载的链接阶段-准备
     */
    public class ClassLoad02 {
        public static void main(String[] args) {
    
        }
    }
    class A {
        //属性-成员变量-字段
        //老韩分析类加载的链接阶段-准备 属性是如何处理
        //1. n1 是实例属性, 不是静态变量,因此在准备阶段,是不会分配内存
        //2. n2 是静态变量,分配内存 n2 是默认初始化 0 ,而不是20
        //3. n3 是static final 是常量, 他和静态变量不一样, 因为一旦赋值就不变 n3 = 30
        public int n1 = 10;
        public static  int n2 = 20;
        public static final  int n3 = 30;
    }
    

     

    package com.hspedu.reflection.classload_;
    
    /**
     * @author 韩顺平
     * @version 1.0
     * 演示类加载-初始化阶段
     */
    public class ClassLoad03 {
        public static void main(String[] args) throws ClassNotFoundException {
            //老韩分析
            //1. 加载B类,并生成 B的class对象
            //2. 链接 num = 0
            //3. 初始化阶段
            //    依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并合并
            /*
                    clinit() {
                        System.out.println("B 静态代码块被执行");
                        //num = 300;
                        num = 100;
                    }
                    合并: num = 100
    
             */
    
            //new B();//类加载
            //System.out.println(B.num);//100, 如果直接使用类的静态属性,也会导致类的加载
    
            //看看加载类的时候,是有同步机制控制
            /*
            protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
            {
                //正因为有这个机制,才能保证某个类在内存中, 只有一份Class对象
                synchronized (getClassLoadingLock(name)) {
                //....
                }
                }
             */
            B b = new B();
        }
    }
    
    class B {
        static {
            System.out.println("B 静态代码块被执行");
            num = 300;
        }
    
        static int num = 100;
    
        public B() {//构造器
            System.out.println("B() 构造器被执行");
        }
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python版电报API接入从零到一(有彩蛋)

文章链接 编号分类文章及链接介绍作者来源分类撰写日期收录日期F1框架python版telegram接入开源botpython-telegram-botGithub2023-04-24 申明&#xff1a;本文仅作试验研究用&#xff0c;不对参考本文操作产生的各种结果承担任何责任。 Q&A 使用Telegram的API需要交费吗…

三顾茅庐,七面阿里,成功上岸25k16薪,我行你也行~

写在片头&#xff1a;声明&#xff0c;勿杠 首先简单说一下&#xff0c;这三次面试阿里并不是一次性去面的&#xff0c;实际上第一次面试时候还在大四&#xff0c;找的实习岗&#xff0c;不太清楚是什么部门&#xff0c;别问我为什么还记得面试题&#xff0c;有记录和复盘的习惯…

什么是OADM光分插复用器

文章导读&#xff1a; 什么是OADM光分插复用器 光分插复用器的功能 光分插复用器的类型&#xff08;FOADM, TOADM&#xff09; OADM的应用 1、什么是OADM光分插复用器 由不同的光通道进出单模光纤。 它的主要功能是在不影响其他波长信道传输的情况下&#xff0c;选择性地下载或…

Vue(监测数据改变、收集表单数据、过滤器)

一、监测数据改变原理 1. 监测对象数据改变原理 当数据发生改变之后&#xff1a;直接会显示数据改变&#xff08;一种强硬写法&#xff09; let data { name: "北京大学", address: "北京" };// 以下通过temp进行监视&#xff1a;还得还原temp值&#xf…

k8s 部署 ldap 服务

1、创建挂载卷&#xff0c;将数据和配置进行持久化存储 1.1、使用nfs作为共享存储 [rootlocalhost openldap_yaml]# cat /etc/exports /dump_file/openldap_db 172.21.53.0/24(rw,sync,no_root_squash,no_all_squash) /dump_file/openldap_conf 172.21.53.0/24(rw,sync,no_roo…

【Linux常见指令以及权限理解】基本指令(1)

写在前面&#xff1a; 相信看完上一个博客&#xff0c;我们已经成功搭建好了Linux环境&#xff0c; 如果没有可以去看看&#xff1a;Linux环境搭建。 接下来我会讲述Linux的常见指令以及权限理解相关内容。 这篇文章会介绍一些常用的Linux指令并穿插一些操作系统的概念理解…

巧用千寻位置GNSS软件|一文教会横断面测量

测横断面主要用于线路工程和水利工程的前期设计中&#xff0c;在线路平曲线设计好之后&#xff0c;千寻位置GNSS软件可用于在中桩处测定垂直于线路中线方向原地貌的地面起伏的数据&#xff0c;本期就为大家介绍具体的操作技巧。 点击【测量】->【测横断面】&#xff0c;选择…

ByteHouse云数仓版查询性能优化和MySQL生态完善

ByteHouse云数仓版是字节跳动数据平台团队在复用开源 ClickHouse runtime 的基础上&#xff0c;基于云原生架构重构设计&#xff0c;并新增和优化了大量功能。在字节内部&#xff0c;ByteHouse被广泛用于各类实时分析领域&#xff0c;最大的一个集群规模大于2400节点&#xff0…

( 栈和队列) 20. 有效的括号 ——【Leetcode每日一题】

❓20. 有效的括号 难度&#xff1a;简单 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;]的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合…

决策树入门、sklearn实现、原理解读和算法分析

文章目录 决策树入门决策树sklean实现决策树算法单/多变量决策树CART分类树算法 决策树分析复杂度控制特征重要性决策树特点 决策树入门 总算来到心心念念的决策树了。工作中一直在用xgb模型&#xff0c;今天开始&#xff0c;终于可以尝试去理解其背后的算法原理了。不过xgb较…

软件开发全套文档案例分享

写在前面 在日常项目开发过程中&#xff0c;会产生大量的过程文档&#xff0c;比如开发过程中的文档、管理过程中的文档、产品相关文档等等&#xff0c;那这些文档我们日常怎么去管理呢&#xff1f;怎么去做规划呢&#xff1f;如何做成通用标准呢&#xff1f;小编特地整理了一…

问卷中多选题如何分析?

一、案例与问卷 本研究选取大学生作为研究对象&#xff0c;旨在通过理财认知、理财现状、理财偏好三个方面&#xff0c;对大学生理财产品了解情况、使用需求进行调查。本次问卷共分为四个部分&#xff1a;第一部分共5道题&#xff0c;为基本信息题&#xff1b;第二部分共3道题…

换肤实现及LayoutInflater原理

文章目录 背景实现换肤步骤解析插件 apk 的包信息获取插件 apk 的 Resources 对象替换资源 简单的插件化换肤实现和存在的问题换肤如何动态刷新&#xff1f;控件换肤刷新的性能考虑如何降低 xml 布局中 View 的替换成本LayoutInflater 原理LayoutInflater.Factory2 替换 View 小…

antDesignPro6: 如何设置环境变量,取值自动根据不同环境,动态修改(3步)。

官网文档&#xff1a;环境变量 - Ant Design Pro Pro 脚手架默认使用 Umi 作为底层框架&#xff0c;在 Umi 内可通过指定 UMI_ENV 环境变量来区分不同环境的配置文件&#xff0c;UMI_ENV 需要在 package.json 内配置。当 UMI_ENV 为 test 时&#xff0c;则必须在 config 目录下…

二十、线索关联市场活动(二):关联

功能需求 用户在线索明细页面,点击"关联市场活动"按钮,弹出线索关联市场活动的模态窗口; 用户在线索关联市场活动的模态窗口,输入搜索条件,每次键盘弹起,根据名称模糊查询市场活动,把所有符合条件的市场活动显示到列表中; 用户选择要关联的市场活动,点击"关联…

电销CRM客户关系管理系统开发12大核心功能

电销CRM管理系统软件是一款专门针对电销行业开发的客户关系管理软件&#xff0c;它能够帮助企业实现对顾客信息的可视化&#xff0c;智能化&#xff0c;自动化管理&#xff0c;提高电销效率和客户满意度。电销行业在传统互联网营销&#xff0c;新媒体营销&#xff0c;短视频营销…

PINNs与DeepXDE:加速物理计算模型

《AIScience系列&#xff08;一&#xff09;&#xff1a;飞桨加速CFD&#xff08;计算流体力学&#xff09;原理与实践》 https://baijiahao.baidu.com/s?id1728002499252273827&wfrspider&forpc 前言 AIScience专栏由百度飞桨科学计算团队出品&#xff0c;给大家带来…

dubbogo中将kubernetes作为注册中心 -- 阅读官方文档

Kubernetes服务发现模型 为了明确 K8s 在服务接入管理提供的解决方案&#xff0c;我们以 kube-apiserver 提供的 API(HTTPS) 服务为例。K8s 集群为该服务分配了一个集群内有效的 ClusterIP &#xff0c;并通过 CoreDNS 为其分配了唯一的域名 kubernetes 。如果集群内的 Pod 需…

不用先存盘直接显示附件内容

大家好&#xff0c;才是真的好。 有些需求总是很小众&#xff0c;但是还是被人需要。 Notes从来可以满足这种需求。 其实使用Notes客户机可以直接打开嵌入到文档中的附件&#xff0c;例如Txt文本、Word或PDF附件等。 不过有人提出&#xff0c;能否直接从Notes文档中的附件读…

CDGP|数据监管越来越严,数据治理发展何去何从?

尽管数据监管越来越严格&#xff0c;但仍然存在许多机会。事实上&#xff0c;数据监管的加强可能会促进金融科技行业更好地运用数据&#xff0c;激发金融科技行业更多的创新和合作,创造更多的价值和机会。 推动金融机构重视数据安全和隐私保护 促使他们采取更严格的安全措施&a…