java(Class 常用方法 获取Class对象六种方式 动态和静态加载 类加载流程)
Class
- Class常用方法
- 获取Class对象六种方式
- 哪些类型有Class对象
- 动态和静态加载
- 类加载流程
- 加载阶段
- 连接阶段
- 连接阶段-验证
- 连接阶段-准备
- 连接阶段-解析
- 初始化阶段
- 获取类结构信息
Class常用方法
第一步:创建一个实体类
public class Car {public String brand = "宝马";public int price = 500000;public String color = "白色";@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", price=" + price +", color='" + color + '\'' +'}';}
}
第二步:常用方法的演示
public class Class02 {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {String classAllPath = "Reflection.Car";//获取到Car类 对应的 Class对象//<?> 表示不确定的Java类型Class<?> cls = Class.forName(classAllPath);//输出clsSystem.out.println(cls); //显示cls对象,是哪个类的Class对象 class Reflection.CarSystem.out.println(cls.getClass());//输出cls运行类型 class java.lang.Class//得到包名System.out.println(cls.getPackage().getName());//包名//得到全类名System.out.println(cls.getName());//通过cls创建对象实例Car car = (Car)cls.newInstance();System.out.println(car);//通过反射获取属性 brandField brand = cls.getField("brand");System.out.println(brand.get(car));//宝马//通过反射给属性赋值brand.set(car,"奔驰");System.out.println(brand.get(car));//奔驰//得到所有的属性(字段)Field[] fields = cls.getFields();for(Field f:fields){System.out.println(f.getName());//名称}}
}
运行结果:
获取Class对象六种方式
第一种:在已知一个类的全类名,且该类在类的路径下,可通过Class类的静态方法Class.forName()获取(多用于配置文件,读取全类路径,加载类)
public class GetClass_ {public static void main(String[] args) throws ClassNotFoundException {//1.Class.forNameString classAllPath = "Reflection.Car";//通过读取配置文件获取Class<?> cls1 = Class.forName(classAllPath);}
}
第二种:若已知具体的类,通过类的class获取,该方式最为安全可靠,程序性能最高
public class GetClass_ {public static void main(String[] args) throws ClassNotFoundException {//2.类名.class,应用场景:用于参数传递Class cls2 = Car.class;}
}
第三种:若已知某个类的实例,调用该实例的getClass()方法获取Class对象
public class GetClass_ {public static void main(String[] args) throws ClassNotFoundException {//3.对象.getClass(),应用场景:有对象实例Car car = new Car();Class cls3 = car.getClass();}
}
第四种:通过类加载器来获取到类的Class对象
public class GetClass_ {public static void main(String[] args) throws ClassNotFoundException {//4.通过类加载器[4种]来获取到类的Class对象String classAllPath = "Reflection.Car";//(1)先得到类加载器 carClassLoader classLoader = car.getClass().getClassLoader();//(2)通过类加载器得到Class对象Class<?> cls4 = classLoader.loadClass(classAllPath);}
}
基本数据类型按如下方式得到Class类对象
public class GetClass_ {public static void main(String[] args) throws ClassNotFoundException {Class<Integer> integerClass = int.class;Class<Character> characterClass = char.class;Class<Boolean> booleanClass = boolean.class;}
}
基本数据类型对应的包装类,可以通过.TYPE得到Class类对象
public class GetClass_ {public static void main(String[] args) throws ClassNotFoundException {Class<Integer> type1 = Integer.TYPE;Class<Character> type2 = Character.TYPE;}
}
哪些类型有Class对象
1.外部类,成员内部类,静态内部类,局部内部类,匿名内部类
2.interface:接口
3.数组
4.enum:枚举
5.annotation:注解
6.基本数据类型
7.void
动态和静态加载
反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载
1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强
假设我现在在代码里面放了一个没有创建的Dog类
public class ClassLoad_ {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入key");String key = sc.next();switch (key){case "1":Dog dog = new Dog();dog.cry();break;case "2":System.out.println("ok");break;default:System.out.println("do nothing");}}
}
导致在编译的时候就发生了报错,虽然我们在运行的时候不一定会使用到,因为new Dog()是静态加载,因此必须编写Dog
2.动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性
public class ClassLoad_ {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {Scanner sc = new Scanner(System.in);System.out.println("请输入key");String key = sc.next();switch (key){case "1":break;case "2":Class cls = Class.forName("Person");//加载Person类Object o = cls.newInstance();Method m = cls.getMethod("hi");m.invoke(o);System.out.println("ok");break;default:System.out.println("do nothing");}}
}
因为反射是动态加载,可以通过编译,只有在运行的时候才会报错,Person类是动态加载,所以,没有编写Person类也不会报错,只有动态加载该类的时候才会报错
1.当创建对象时(new) //静态加载
2.当子类被加载时,父类也加载 //静态加载
3.调用类中的静态成员时//静态加载
4.通过反射//动态加载
类加载流程
加载阶段
JVM在该阶段的主要目的是将字节码从不同的数据源(可能是class文件、也可能是jar包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的java.long.Class对象
连接阶段
连接阶段-验证
目的是为了确定文件中字节流包含的信息符合当前虚拟机的要求,并且不会危害安全,可以考虑使用-Xverify:none参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间
连接阶段-准备
JVM会在该阶段对静态变量,分配内存默认初始化(对应数据类型的默认初始值,如0、0L、null、false等)。这些变量所使用的内存都将在方法区中进行分配(常量和静态变量不一样,因为一旦赋值就不变,它直接就是它对应的值)
连接阶段-解析
虚拟机将常量池的符号引用替换为直接引用的过程中,在编译的过程中因为没有实际的内存地址,所以只能用符号的方法来记录,当加载好之后用地址来替换
初始化阶段
到初始化阶段,才真正开始执行类中定义的java程序代码,此阶段是执行()方法过程()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并
示例代码:
public class ClassLoad03 {public static void main(String[] args) {//1.加载B类,并生成B的class对象//2.连接 num = 0;//3.初始化阶段// 依次自动收集类中的所有静态变量的赋值动作和静态代码快的语句/*
* clinit(){
* System.out.println("B 静态代码快被执行");
* num = 300;
*
* 合并:num=100}*/new B(); System.out.println(B.num);}
}
class B{static {System.out.println("B 静态代码快被执行");num = 300;}static int num = 100;public B(){System.out.println("B() 构造器被执行 "+num);}
}
运行结果:
如果直接使用类的静态属性,也会导致类的加载
注:
虚拟机保证一个类的()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的()方法,其他线程都需要阻塞等待,直到线程执行()方法完毕
获取类结构信息
public class ReflectionUtils {public static void main(String[] args) throws ClassNotFoundException {api_01();}//第一组方法APIpublic static void api_01() throws ClassNotFoundException {//得到Class对象Class<?> personCls = Class.forName("Reflection.com.hspedu.classload.Person");//获取全类名System.out.println(personCls.getName());//获取简单类名System.out.println(personCls.getSimpleName());//获取所有public修饰的属性,包含本类及父类Field[] fields = personCls.getFields();for (Field field : fields) {System.out.println("本类及父类属性="+field.getName());}//获取本类中所有属性Field[] declaredFields = personCls.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println("本类中所有的属性="+declaredField.getName());}//获取所有public修饰的方法,包含本类以及父类Method[] methods = personCls.getMethods();for (Method method : methods) {System.out.println("本类以及父类的方法="+method.getName());}//获取本类所有的方法Method[] declaredMethods = personCls.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println("本类所有方法="+declaredMethod.getName());}//获取所有public修饰的构造器,包含本类Constructor<?>[] constructors = personCls.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println("本类以及父类的构造器="+ constructor.getName());}//获取本类所有的构造器Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println("本类所有的构造器"+declaredConstructor.getName());}//以Package形式返回包信息System.out.println(personCls.getPackage());//以Class形式返回父类信息System.out.println("父类的class对象"+personCls.getSuperclass());//以Class[]形式返回接口信息Class<?>[] interfaces = personCls.getInterfaces();for (Class<?> anInterface : interfaces) {System.out.println("接口信息="+anInterface.getName());}//返回注解信息Annotation[] annotations = personCls.getAnnotations();for (Annotation annotation : annotations) {System.out.println("注解信息="+annotation);}}
}
interface IA{}
interface IB{}
class A{public String hobby;public void hi(){}public A(){}
}
@Deprecatedclass Person extends A implements IA,IB{public Person(){}public Person(String s){ }private Person(String name,int age){}//属性public String name;protected int age;String job;private double sal;//方法public void m1(){}protected void m2(){}void m3(){}private void m4(){}}
public class ReflectionUtils {public static void main(String[] args) throws ClassNotFoundException {api_02();}public static void api_02() throws ClassNotFoundException {//得到Class对象Class<?> personCls = Class.forName("Reflection.com.hspedu.classload.Person");//获取本类所有属性Field[] declaredFields = personCls.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println("本类中的所有属性="+declaredField.getName()+" 该属性的修饰符值="+declaredField.getModifiers()+" 该属性的类型="+declaredField.getType());}}
}
interface IA{}
interface IB{}
class A{public String hobby;public void hi(){}public A(){}
}
@Deprecatedclass Person extends A implements IA,IB{public Person(){}public Person(String s){ }private Person(String name,int age){}//属性public String name;protected static int age;String job;private double sal;//方法public void m1(){}protected void m2(){}void m3(){}private void m4(){}}
相关文章:
java(Class 常用方法 获取Class对象六种方式 动态和静态加载 类加载流程)
ClassClass常用方法获取Class对象六种方式哪些类型有Class对象动态和静态加载类加载流程加载阶段连接阶段连接阶段-验证连接阶段-准备连接阶段-解析初始化阶段获取类结构信息Class常用方法 第一步:创建一个实体类 public class Car {public String brand "宝…...
【数据结构】线性表和顺序表
Yan-英杰的主页 悟已往之不谏 知来者之可追 目录 1.线性表 2.顺序表 2.1 静态顺序表 2.2 动态顺序表 2.3移除元素 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线…...
Ubuntu数据库安装(mysql)
##1.下载mysql-apt-config_0.8.22-1_all.deb并且安装 wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb##2.更新apt-updata sudo apt update##3.如果出现如下图情况执行以下命令 [外链图片转存失败,源站可…...
MyBatis-Plus的入门学习
MyBatis-Plus入门学习简介特性快速开始MyBatis-Plus的注解详解Tableld主键生成策略1、数据库自动增长 AUTO2、UUID3、Redis生成id4、MP主键自动生成TableNameTableField自动填充测试方法:update乐观锁select查所有根据id查多个id批量查询简单条件查询(通…...
华为OD机试题 - 内存池(JavaScript)
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:内存池题目输入输出示例一输入输出说明Code解题思路版权说明华为…...
数据库索引原理
数据库索引的作用是做数据的快速检索,而快速检索实现的本质是数据结构。像二叉树、红黑树、AVL树、B树、B树、哈希等数据结构都可以实现索引,但其中B树效率最高。MySQL数据库索引使用的是B树。二叉树:二叉树中,左子树比根节点小&a…...
字符函数和字符串函数详解(1)
目录前言strlen函数strlensizeofstrcpy函数strcat函数strcmp函数总结前言 最近要调整状态,写的文章质量不佳让大家失望,我现在也在反思我在做什么,我会什么,我学了什么。等我想明白的那天,我一定能跟大家顶峰相见的&a…...
【数据分析:工具篇】NumPy(1)NumPy介绍
【数据分析:工具篇】NumPy(1)NumPy介绍NumPy介绍NumPy的特点数组的基本操作创建数组索引和切片数组运算NumPy介绍 NumPy(Numerical Python)是Python的一个开源的科学计算库,它主要用于处理大规模的多维数组…...
mysql时区问题
设置mysql容器时间与服务器时间一致 问题背景: 今天测试发现一个问题,时间不一致,当工单入库时,其创建时间和更新时间应该是一样的,即使不一样最多只会错几秒的时间;实际上两个时间相差的大概8小时&#…...
磨金石教育摄影技能干货分享|高邮湖上观花海
江苏高邮,说到这里所有人能想到的,就是那烟波浩渺的高邮湖。高邮在旅游方面并不出名,但是这里的自然人文景观绝对不输于其他地方。高邮不止有浩瀚的湖泊,春天的油菜花海同样壮观。春日的午后,与家人相约游玩࿰…...
mysql navicat忘记密码
mysql忘记密码是常用的事情,那么如何解决它呢?1、首先将MySQL的服务关闭,两种方法:(1)打开命令行cmd输入net stop mysql命令即可关闭MySQL服务。(2)打开任务管理器,找到服…...
Git的下载、安装、配置、使用、卸载
前言 我是跟着狂神老师学的。该博客仅用于笔记所用。 下面是老师的B站和笔记 B站:https://www.bilibili.com/video/BV1FE411P7B3?p1&vd_source9266cf72b1f398b63abe0aefe358d7d6 笔记:https://mp.weixin.qq.com/s/Bf7uVhGiu47uOELjmC5uXQ 一、准备工…...
【博客631】监控网卡与进程网络IO使用情况
监控进程的网络IO使用情况 1、vnstat 由于 vnstat 依赖于内核提供的信息,因此执行以下命令来验证内核是否提供了 vnStat 所期望的所有信息: # vnstat --testkernel This test will take about 60 seconds. Everything is ok.不带任何参数的 vnstat 将…...
【Leetcode】【简单】35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 2: 输入:…...
sql面试题
mysql优化 优化准则: 建表时:合理选择字段的类型,单表字段数量 sql查询尽量单表操作,避免复杂操作,复杂的多表通过java代码实现 构建复合索引优化,索引尽量可以覆盖主要业务查询 sql避免索引失效 避免大…...
SQL 进阶刷题笔记
SQL 进阶刷题笔记 一、MySQL 进阶 这里主要是 MySQL 刷题相关笔记,方便后面温习和查阅,希望可以帮到大家!!! 题1 请计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score࿰…...
[网鼎杯 2020 朱雀组]Think Java
SqlDict.java ,其中sql语句处存在sql注入漏洞 package .sqldict;import cn.abc.core.sqldict.Row; import cn.abc.core.sqldict.Table; import java...
AIR32F103(十) 在无系统环境和FreeRTOS环境集成LVGL
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告AIR32F103(二) Linux环境和LibOpenCM3项目模板AIR32F103(三) Linux环境基于标准外设库的项目模板AIR32F103(四) 27倍频216MHz,CoreMark跑分测试AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码AIR32F103(六) ADC,I2S…...
SpringBoot接口 - 如何统一异常处理
SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?为什么要优雅的处理异常如果我们不统一的处理异常,经常会在controller层有大量的异常…...
如何使用Python进行数据可视化
数据可视化是一种将数据呈现为图形或图表的技术,它有助于理解和发现数据中的模式和趋势。Python是一种流行的编程语言,有很多库可以帮助我们进行数据可视化。在本文中,我们将介绍使用Python进行数据可视化的基本步骤。 第一步:导…...
vue -- 自定义指令钩子函数补充 自定义过滤器filter参数
自定义指令补充 自定义指令通过钩子函数的形式来实现自定义的功能 这里是几个常用的钩子函数以及它的方法: bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置。 inserted:被绑定元素插…...
Qt不会操作?Qt原理不知道? | Qt详细讲解
文章目录Qt界面开发必备知识UI界面与控件类型介绍Qt设计器原理控件类型的介绍信号与槽机制处理常用控件创建与设置常见展示型控件创建与设置常见动作型控件创建与设置常见输入型控件创建与设置常见列表控件创建于设置Qt中对象树的介绍项目源码结构刨析.pro.hmain.cpp.cppQt界面…...
LeetCode-面试题 17.05. 字母与数字【前缀和,哈希表】
LeetCode-面试题 17.05. 字母与数字【前缀和,哈希表】题目描述:解题思路一:前缀和。数字为-1,字母为1。我们需要找到的子数组是前缀和之差为0的,例如s[right]-s[left]0,那么s[right]s[left],变为…...
华为OD机试题 - 叠放书籍(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:叠放书籍题目输入输出示例一输入输出Code解题思路版权说明华为O…...
【数据库概论】第十一章 数据库并发控制
第十一章 并发控制 在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务并行运行,这就是同时并发方式。当多个用户并发存取数据库时会产生多个事务同时存取同一事务的情况,如果…...
Nginx配置实例-反向代理案例二
实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口服务 nginx监听端口为9000, 访问 http://127.0.0.1:9000/edu/ 直接跳转到127.0.0.1:8080 访问 http://127.0.0.1:9000/vod/ 直接跳转到127.0.0.1:8081 一、准备工作 1. 准备两个tom…...
HTML 字符集
为了正确显示 HTML 页面,Web 浏览器必须知道要使用哪个字符集。 从 ASCII 到 UTF-8 ASCII 是第一个字符编码标准。ASCII 定义了 128 种可以在互联网上使用的字符:数字(0-9)、英文字母(A-Z)和一些特殊字符…...
【C语言】每日刷题 —— 牛客语法篇(3)
前言 大家好,继续更新专栏c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页:悲伤的猪大肠9的博客…...
基于Vue3和element-plus实现一个完整的登录功能
先看一下最终要实现的效果:登录页面:注册页面:(1)引入element-plus组件库引入组件库的方式有好多种,在这里我就在main.js全局引入了.npm i element-plus -Smain.js中代码:import { createApp } from "vue"; //element-plus import ElementPlus from "element-pl…...
【java】Java 中泛型的实现原理
文章目录前序1. 泛型1.1 泛型方法1.2 泛型类1.3 泛型接口2. 泛型的基本原理3. 小结前序 泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码。本文总结了 Java 泛型的三种形式以及泛型实现原理。 1. 泛型 …...
做网站客户拖着不验收/亚马逊关键词优化怎么做
前言 之前总是在找方向,也研究了很多的工具,终于找到了适合自己的一套,打算把学习的过程做一个记录,给自己加深印象,也希望能给其他人一些帮助。 一、工具准备 1、Appium // http://appium.io/ 2、GenymotionOracel …...
网站建设到底属于什么行业/专业的郑州网站推广
引用类型数据作为参数看这样一个例子:public class Test1 {public static void main(String[] args) {String a "aaa";System.out.println(a);change(a);System.out.println(a);}static void change(String b) {b "bbb";}}你觉得打印结果会是…...
如何通审查元素做网站/网站seo关键词排名推广
1、在Java中不属于整型变量的是()A、longB、byteC、doubleD、shortE、int2、以下变量声明正确的是()A、int Int%;B、float f_double;C、byte b1264;D、char &address;3、在某个类中存在一个方法:void get S ort(int x),以下哪个是方法重载的声明()A、public get…...
可以免费推广的网站/焦作关键词优化排名
https://developer.mozilla.org/en-US/docs/Plugins转载于:https://www.cnblogs.com/anyboo/p/3196453.html...
做网站 0元代理/重庆seo招聘
一、关闭烦人的eslint-loader新人在使用vue的时候,你是否遇到过这样的烦恼,看到这个我瞬间懵逼了,这个是什么,真是烦死了,那么我们只需要关闭他的eslint-loader就好了,这个时候你首先会Google,但…...
政府网站旅游栏目建设/网络营销的营销策略
最近,Eclipse(Eclipse-JEE3.5)运行十分缓慢(可能插件安装过多),因此,得到了个机会调优一下,以便提高工作效率下图是未经任何调整eclipse的gc情况(使用jvisualvm命令&…...