Java之class类

news2024/12/27 9:56:43

Class类

在这里插入图片描述
1.类图在这里插入图片描述

2.Class类对象 系统创建在这里插入图片描述
该class对象是通过类加载器ClassLoader的loadClass()方法生成对应类对应的class对象
通过debug可以追到该方法
在这里插入图片描述
3.对于某个类的class类对象
只加载一次
因为类值加载一次
类加载的时机

//1.创建对象实例的时候(new)
//2.创建子类对象实例的时候,父类也会被加载
//3.使用该类的静态成员变量时,该类也会加载

演示一下
在这里插入图片描述
运行结果
在这里插入图片描述
4.在这里插入图片描述
大概就是我们创建的对象(比如cat)
这个cat对象和我们堆中Cat类对于的Class对象
有联系,cat和对应的Cat类的Class对象有联系

简而言之,每个对象从属于所属类的Class对象
其实我们的getClass返回的就是这个Class对象
5.通过对应方法来获得对应的属性/方法,具体在下面常用方法

6.没什么好说的
7.
在这里插入图片描述

常用方法

在这里插入图片描述

package yuan.hsp.reflection.Class;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import yuan.hsp.reflection.Cat;
@SuppressWarnings({"all"})
//class类的基本介绍
public class introduce {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, NoSuchFieldException {
	String classPath="yuan.hsp.reflection.Class.Car";
	//1.获取到Car类对应的Class对象
	Class cls = Class.forName(classPath);
	//2.输出cls
	System.out.println(cls);//会显示是哪个类的Class对像(应该是toString重写的)
	System.out.println(cls.getClass());//输出cls的运行类型 java.lang.Class
	//3.得到包名
	System.out.println("================================");
	System.out.println(cls.getPackage().getName());
	System.out.println(cls.getPackageName());//两种都可以
	//4.得到全类名
	System.out.println("================================");
	System.out.println(cls.getName());//返回类名
	//5.通过cls创建对象实例
	Object newInstance = cls.newInstance();//当然这个现在弃用了
	
	Car newInstance2 = (Car)cls.getDeclaredConstructor().newInstance();//现在一般用这个方法
	//先获构造器再创建对象实例
	System.out.println(newInstance2);
	//6.通过反射获取属性brand,注意:私有属性不能通过该方式获取,后面有单独讲
	Field brand = cls.getField("brand");
	System.out.println(brand.get(newInstance2));
	//7.通过反射给属性赋值
	brand.set(newInstance2, "奔驰");
	System.out.println(brand.get(newInstance2));
	//8.希望可以得到Car里所有的属性
	System.out.println("======================================");
	Field[] fields = cls.getFields();
	for (Field field : fields) {
		System.out.println(field.getName());//依次输出属性的名称
	}
	
	
}
}

class Car{
	public String brand="宝马";
	public int price=1000000;
	public String color="白";
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", price=" + price + ", color=" + color + "]";
	}
	
}

运行结果
class yuan.hsp.reflection.Class.Car
class java.lang.Class
================================
yuan.hsp.reflection.Class
yuan.hsp.reflection.Class
================================
yuan.hsp.reflection.Class.Car
Car [brand=宝马, price=1000000, color=白]
宝马
奔驰
======================================
brand
price
color

获取Class类对象的六种方式

主要方法是前四种
还有两种特别的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package yuan.hsp.reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

//本篇主要是获取Class类的各种方法
@SuppressWarnings({"all"})
public class GetClass {
	public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException, IOException {
		//1.Class.forName(对应类的全路径)-常用于配置文件读取类全路径,加载类
		Properties properties = new Properties();
		properties.load(new FileInputStream("src\\re.properties"));
		String classfullpath = properties.get("classfullpath").toString();
		Class cls1 = Class.forName(classfullpath);
		System.out.println(cls1);
		//2.若已知具体的类,通过类的class获取,该方式最安全可靠程序性能最高-多用于参数传递
		Class cls2 = Cat.class;
		System.out.println(cls2);
		//3.已知某个类的实例,调用该对应的getClass()方法,获取对象所属类对应的Class对象-应用场景:通过建好的对象,获取Class对象(运行类型)
		Cat cat = new Cat();
		Class cls3 = cat.getClass();
		System.out.println(cls3);
		//4.通过类加载器获取类的Class对象
		//(1)先得到类加载器cat
		ClassLoader classLoader = cat.getClass().getClassLoader();
		//(2)通过类加载器得到Class对象
		Class cls4 = classLoader.loadClass(classfullpath);
		System.out.println(cls4);
		//cls1,cls2,cls3,cls4都是同一个Class对象
		
		//基本数据类型获取class的两种方式
		//1.(基本数据类型int,short,long).class得到Class对象
		Class<Integer> i = int.class;
		Class<Character> c = char.class;
		System.out.println(i);
		System.out.println(c);
		//2.基本数据类型对应的包装类.type,获得对应的Class对象
		Class<Integer> type = Integer.TYPE;
		System.out.println(type);
		//然后其实这个int和Integer其实是对应的一个Class,int自动装箱为Integer获取对应的Class对象
		System.out.println(i.hashCode());
		System.out.println(type.hashCode());
	}

}

其实前四种方式是不同阶段的获取
1.代码阶段2.加载阶段3.RunTime阶段(创建完对象后)4类加载过程阶段
在这里插入图片描述

哪些类有Class对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

7-10 列车调度

火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入&#xff0c;最后从出口离开。在图中有9趟列车&am…

联合证券|道指狂拉700点!八大科技巨头市值暴涨1.3万亿!

本周最终一个交易日&#xff0c;美股三大指数收盘团体大涨。道指涨2.13%&#xff0c;标普500指数涨2.28%&#xff0c;纳斯达克指数涨2.56%。 大型科技股遍及走强&#xff0c;苹果、亚马逊涨超3%。特斯拉经历惊险一夜&#xff0c;股价盘初跌近8%后反弹&#xff0c;收盘涨幅超2%。…

上半年要写的博客,提前占坑1

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

第二章 创建数据集

2.1 数据集的概念 数据集通常是由数据构成的一个矩形数组&#xff0c;行表示观测&#xff0c;列表示变量。表2-1提供了一个假想的病例数据集。 不同的行业对于数据集的行和列叫法不同。统计学家称它们为观&#xff08;observation&#xff09;和变量&#xff08;variable&…

可变形卷积DCN/DConv

1、定义 可变形卷积是指卷积核在每一个元素上额外增加了一个方向参数&#xff0c;这样卷积核就能在训练过程中扩展到很大的范围&#xff0c;卷积核可以变成任意方向。 图(a)是普通卷积 图(b)、©、(d)是可变形卷积&#xff0c;©(d)是(b)的特例 2、为什么要使用可变…

Nginx配置负载均衡到网关

Nginx配置负载均衡到网关 1.需求图示 前置准备工作 https://blog.csdn.net/qq_44981526/article/details/128599898 2.配置实现 1.在C:\Windows\System32\drivers\etc目录下修改hosts文件 #配置llpliving.com nginx虚拟机 192.168.56.100 www.llpliving.com2.配置nginx负载…

【C++】优先级队列priority_queue仿函数

这里先简单介绍一下优先级队列priority_queue&#xff1a;优先队列是一种容器适配器,默认的情况下&#xff0c;如果没有为特定的priority_queue类实例化指容器类&#xff0c;则使用vector (deque 也是可以的),需要支持随机访问迭代器&#xff0c;以便始终在内部保持堆结构 文章…

Springboot配置静态资源

目录 1. springboot默认的静态资源存放路径 2.Springboot添加静态资源映射addResourceHandlers addResourceLocations 3.坑 如果方法一和二同时配置 那么就会遵循方法二 方法一的静态文件将找不到 1. springboot默认的静态资源存放路径 静态资源的存放路径为classpath,也就是…

【卷积码系列4】卷积码的状态转移函数、距离谱和译码性能界分析及matlab仿真

一、卷积码的状态图和转移函数 以一个例子入手,对于如下编码器所示的码率1/3卷积码 根据输入和寄存器状态,可以得到其状态图如下所示 图中虚线表示输入比特为1时的转移,而实线表示输入比特为0时的转移 同样,图中虚线表示输入比特为1时的转移,而实线表示输入比特为0…

Diffusion Models从入门到放弃:必读的10篇经典论文

前言&#xff1a;diffusion models是现在人工智能领域最火的方向之一&#xff0c;并引爆了AIGC方向&#xff0c;一大批创业公司随之诞生。笔者2021年6月开始研究diffusion&#xff0c;见证了扩散模型从无人问津到炙手可热的过程&#xff0c;这些篇经典论文我的专栏里都详细介绍…

从0到1完成一个Vue后台管理项目(五、登录页(表单校验的使用和封装))

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

IDEA的使用

1.安装 官网: https://www.jetbrains.com/IDEA 工作界面介绍 2.使用技巧 √设置字体和颜色主题 菜单 file -> settings √字符编码设置 可以自己设置快捷键 常用快捷键&#xff1a;删除当前行, 默认是 ctrl Y 自己配置 ctrl d复制当前行, 自己配置 ctrl alt 向下光…

10、可观测性--系统告警

文章目录告警的作用告警数据来源黑盒白盒日志统计指标链路追踪故障分类告警的作用 在没有告警的时候&#xff0c;我们一般是人工定期地查看相关的指标或者链路数据&#xff0c;再去程序上确认。虽然人工也能监控&#xff0c;但有时还是难以判定是否真的出现了问题&#xff0c;…

【云原生进阶之容器】第二章Controller Manager原理2.6节--Informer controller

6 Informer 的 controller DeltaFIFO 是一个非常重要的组件,真正让他发挥价值的,便是 Informer 的 controller。 虽然 Kubernetes 源码中的确用的是 controller 这个词,但是此 controller 并不是 Deployment Controller 这种资源控制器。而是一个承上启下的事件控制器(从 A…

Java并发编程学习14-任务关闭(下)

任务关闭&#xff08;下&#xff09; 《任务关闭》由于篇幅较多&#xff0c;拆分了两篇来介绍各种任务和服务的关闭机制&#xff0c;以及如何编写任务和服务&#xff0c;使它们能够优雅地处理关闭。 1. 处理非正常的线程终止 我们知道&#xff0c;当单线程的控制台程序由于…

Urban NeRF

本文首发于馆主君晓的博客&#xff0c;文章链接 简要介绍 这是谷歌和多伦多大学合作的一篇发表在CVPR2022上的工作&#xff0c;延续NeRF重建的相关思路。考虑到之前的一些工作要么是在合成数据集上进行的NeRF重建&#xff0c;要么就是用到真实的场景&#xff0c;但是场景很小&a…

JDK1.8和JDK1.7的HashMap源码分析以及线程不安全问题

参考&#xff1a; 教你如何阅读HashMap源码~吊打面试官 - 腾讯云开发者社区-腾讯云 (tencent.com) 有一些面试题 Map - HashSet & HashMap 源码解析 | Java 全栈知识体系 (pdai.tech) HashMap源码&底层数据结构分析 | JavaGuide(Java面试学习指南) hashmap头插法和尾插…

LAB1 VRRP实验

■实验拓扑 ■实验需求 多厂商的网关冗余&#xff08;VRPP&#xff09; 考虑上行/上上行/下行链路的之间的track 生成树配置 VPC能访问R4的loopback口地址&#xff08;8.8.8.8&#xff09; ■实验步骤 ▶思科路由器CISCO-R4 Router(config)#hostname CISCO-R4 CISCO-…

【博客581】为什么MASQUERADE都在POSTROUTING做

为什么MASQUERADE都在POSTROUTING做 MASQUERADE都在POSTROUTING做&#xff0c;为什么不能在output做 1、iptables flow graph&#xff1a; 2、output之后的routing和rerouting&#xff1a; 对于本机 app 发出(outcoming)的流量&#xff0c;netfilter 有2次 routing 过程&…

算法刷题打卡第59天:相交链表

相交链表 难度&#xff1a;简单 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 …