JavaEE初阶---properties类+反射+注解
文章目录
- 1.配置文件properities
- 2.快速上手
- 3.常见方法
- 3.1读取配置文件
- 3.2获取k-v值
- 3.3修改k-v值
- 3.4unicode的说明
- 4.反射的引入
- 4.1传统写法
- 4.2反射的写法(初识)
- 4.3反射的介绍
- 4.4获得class类的方法
- 4.5所有类型的class对象
- 4.6类加载过程
- 4.7类初始化的过程
- 4.8类加载过程
- 4.9获取类的运行时结构
- 4.10动态创建对象
- 4.11获取成员属性方法
- 4.12性能测试
- 5.反射的应用
- 5.1操作泛型
- 5.2操作注解
- 6.注解annotation
- 6.1内置注解
- 6.2元注解
- 6.3自定义注解
- 6.3自定义注解
1.配置文件properities
这个properity是一个类:方便实现对于这个项目的相关的属性内容的设置;
例如我们想要使用这个程序对于这个数据库进行操作,我们的这个程序本来是针对于这个数据库01进行操作的,后来修改为这个对于02进行操作,如果我们没有使用这个配置文件,就需要在这个源码上面进行修改,这个不是我们想要看到的,如果我们引入了这个配置文件;
这个时候因为我们的这个程序是从这个配置文件里面读取内容的,因此这个程序的代码不需要进行修改,我们只需要把这个配置文件的这个用户名和密码修改为我们的db02数据库的就可以了;
2.快速上手
下面的这个就是我们的一个包包里面的配置文件:这个配置文件里面的信息就是我们的ip,用户名和密码;
我们在这个java文件里面,需要创建对象读取这个配置文件里面的内容,这个就涉及到了这个路径的指定,是从我们的这个src开始的,根据我们的这个目录结构进行修改即可;
然后我们使用这个while循环不断的从这个对象里面进行内容的读取,这个就会全部打印输出;
在上面的这个方式下,我们的打印输出的结果就是我们的这个配置文件里面的格式:
下面的这个就是另外一个打印输出的方法的展示:就是我们不是直接把这个配置文件里面的信息打印出来,而是按照我们想要的这个格式,使用这个split进行分割处理,进行拼接之后再打印出来;(这个刚开始的时候遇到了bug,就是因为这个配置文件每一行之间加上了空格,这样的话督导第二行没有了然后这个split[1]这个下标就会报错是越界,因此上面的这个配置文件里面的这个内容需进行修改为连续的三行,否则会报错);
但是即使这样,我们想要修改这个文件的用户名和方法还是不容易;因为这个需要我们的代码进行修改;
3.常见方法
3.1读取配置文件
我们首先需要创建一个类,读取我们的这个配置文件内容(new filereader里面的这个参数就是我们的这个配置文件的地址);
最后使用这个list方法把我们的这个读取的文件里面的内容打印到我们的这个对应的设备上面去;
3.2获取k-v值
在上面的这个基础上,我们可以使用这个getProperty方法,根据我们传递进去这个key参数,获得这个对应的value值,这个就是我们根据这个k获取到这个对应的value的一个方法;
3.3修改k-v值
这个表面上写的是修改,实际上是包含了这个添加新的这个k-v的情况的:
我们调用这个里面的serProperties方法对于这个key对应的value进行修改,如果这个key是存在的,这个就是修改对应的value数值;
如果这个key不存在,下面的这个password2就是不存在的,这个时候就是进行新的k-v的添加;
store表示把这个创建的对象存储到我们的这个配置文件里面去,第一个参数就是我们的路径,第二个参数写的是comment(这个是idea自带的)表示的就是注释的意思,我们使用null代替就可以了;
3.4unicode的说明
我们上面修改这个名字是中文,这个时候我们的这个配置文件里面显示的其实是这个unicode编码,并不是我们的中文,我们可以使用这个转换器进行查看结果是否正确;
我们使用这个转换工具就可以看到这个效果:
4.反射的引入
4.1传统写法
我们的这个反射是需要基于上面的这个类的,因此上面相当于就是介绍一下这个类的相关的用法;
下面的是是两个传统方法:
1)直接创建对象,调用这个对象里面的方法;
2)使用文件流读取,获取这个对应的value数值,并且打印出来;
4.2反射的写法(初识)
4.3反射的介绍
下面的这个就是我们自己定义一个实体类:
4.4获得class类的方法
4.5所有类型的class对象
2)元素类型一样,例如这个数组,个数不一样,但是这个类型一样,他们的这个class打印出来的这个hashcode还是一样的;
4.6类加载过程
上面的这个类加载的过程,分为三个步骤:
1)加载:就是生成在这个相关的数据,每一个类里面都是有自己的这个数据的;
2)链接:每一个类生成自己的这个Class对象,进行连接就是检查是不是有错误;
3)初始化:没有错误就会进行初始化,刚开始这个m初始化的是0.然后我们创建这个对象,这个对象就会找到自己的这个类对象,进行这个合并,刚开始是300,后来是100,因此这个最后打印输出的这个结果就是100;
4.7类初始化的过程
1)主动引用一定会发生这个类的初始化:下面的这个new对象和反射就是主动引用的过程;
2)被动引用不会进行类的初始化:下面的这个直接调用子类的这个静态变量,创建数组,以及常量的使用都是属于这个被动引用的范畴的,都是不会执行这个初始化的操作的;
4.8类加载过程
1)类加载的作用:把class文件的字节码的内容加载到我们的这个内存里面去,在这个堆区上面生成一个Class对象,这个对象就是我们的访问入口;
2)类缓存:一旦某一个类加载到了这个类加载器里面去,他就会维持一段时间,不过这个JVM的垃圾回收机制会对于这个Class对象进行处理;
4.9获取类的运行时结构
1)field就是获取这个类加载的时候的相关的属性,加上这个declare修饰就是强制获取,第一个只能获取到这个公共的方法,但是我们加上这个declare修饰之后即使是私有的方法,我们也是可以获取到的;
4.10动态创建对象
下面的这个就是需要有我们的无参数的构造器:
上面的这个是需要我们的这个类里面有无参数的构造方法,如果这个无参数的构造方法没有了,这个时候就会报错,下面的这个就是在原来的这个基础上面,我们自己写一个构造器出来,这样无论是有参数无参数,我们自己写的这个构造器都是可以传参的;
我们的这个构造器里面的参数就是我们的三个成员变量,我们创建对象的时候,就是用我们的这个构造器;
4.11获取成员属性方法
下面的这个就是我们使用无参数的构造器创建对象,setAccessible表示的就是关闭安全检查,即使我们的这个name是私有的,我们使用这个declared版本的还是可以得到的;
set相当于就是传递参数,第一个就是我们的这个对象,第二个参数就是这个对象的属性name具体值;
4.12性能测试
下面的这个是三个不同的方式的一个效率的对比:
1)test01就是普通方法;
2)test02就是反射,但是不关闭这个检测;
3)test03就是2的基础上面关闭这个检测的机制;
可以在自己的这个IDEA上面运行感受一下这个时间的耗费;
public class Test {public static void test01 () {User user = new User();long startTime = System.currentTimeMillis();for (int i = 0; i < 100000000; i++) {user.getName();}long endTime = System.currentTimeMillis();System.out.println("正常运行"+(endTime - startTime)+"ms");}public static void test02 () throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {User user = new User();Class c1=user.getClass();Method getName = c1.getDeclaredMethod("getName",null);//getName.setAccessible(true);long startTime = System.currentTimeMillis();for (int i = 0; i < 100000000; i++) {getName.invoke(user,null);}long endTime = System.currentTimeMillis();System.out.println("反射的方式,不关闭检测:"+(endTime - startTime)+"ms");}public static void test03 () throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {User user = new User();Class c1=user.getClass();Method getName = c1.getDeclaredMethod("getName",null);getName.setAccessible(true);long startTime = System.currentTimeMillis();for (int i = 0; i < 100000000; i++) {getName.invoke(user,null);}long endTime = System.currentTimeMillis();System.out.println("反射的方式,关闭检测:"+(endTime - startTime)+"ms");}public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {test01();test02();test03();}
}class User{String name;int age;int id;public User(String name, int age, int id) {};public User() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", id=" + id +'}';}
}
5.反射的应用
5.1操作泛型
打印结果获取这个泛型的参数类型的相关的信息:
5.2操作注解
下面的这个实际上是基于一个数据库的;
我们可以获取这个方法的注解,以及这个相关的属性的注解
import java.lang.annotation.*;
import java.lang.reflect.Field;public class Test{public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {Class c1 = Class.forName("demo18.Test2");Annotation[] annotations = c1.getAnnotations();for (Annotation annotation : annotations) {System.out.println(annotation);}Tablekuang tablekuang = (Tablekuang)c1.getAnnotation(Tablekuang.class);String value = tablekuang.value();System.out.println(value);Field f = c1.getDeclaredField("name");Fieldkuang annotation = f.getAnnotation(Fieldkuang.class);System.out.println(annotation.columnName());System.out.println(annotation.type());System.out.println(annotation.length());}}
@Tablekuang("db_student")
class Test2 {@Fieldkuang(columnName = "student1",type="int",length=10)private int id;@Fieldkuang(columnName = "student2",type="int",length=10)private int age;@Fieldkuang(columnName = "student3",type="varchar",length=10)private String name;public Test2(){}public Test2(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Test{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}
}@Target(ElementType.TYPE)
//生命周期
@Retention(RetentionPolicy.RUNTIME)
@interface Tablekuang{//下面的这个就是我们的注解,而不是方法String value();
}//下面的这个是对于属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldkuang{//下面的这个就是我们的注解,而不是方法String columnName();String type();int length();}
下面的这个就是获取我们的属性的注解,这个里面的name是可以进行修改的,如果是name我们获得的就是这个name的注解,如果是其他的成员变量,因为这个除了name还有我们的id和age,其他的两个属性也是可以获得对应的这个注解的,我们可以获取任何的字段的这个注解;
6.注解annotation
@override就是对于方法的重写,这个就是注解,我们经常使用,只是我们没有注意罢了;
下面的这个抑制警告的这个就是内置注解;override也是一个内置的注解;
6.1内置注解
6.2元注解
我们上面的这个注解就是模仿的这个下面的源代码进行书写的,就是定义这个interface,上面的这个target里面的这个参数表示的就是作用的范围;我们上面的这个例子里面的这个是method表示这个注解只能是作用在我们的这个方法的上面,因此上面我们把这个加在test类的外面的时候,这个注解就会报错;
当我们使用下面的这个类似于集合的方式进行表示的时候,这个的意思就是我们的这个注解不仅可以放在这个类上面,也是可以放到这个方法上面的;这个时候我们把这个注解放到这个test的外面,就不会报错了;
我们下面的这个retention表示这个注解生效的时间,也就是这个注解的生命周期,我们可以看到这个参数里面是有三个可选项的:我们一般写作这个runntime让这个注解的生命周期长一些;
下面的这个就是一个比较完整的演示:这个里面的@interface表示的是一个自定义的注解,我们后面还会遇到,其他的就是我们的元注解;
6.3自定义注解
们的这个注解不仅可以放在这个类上面,也是可以放到这个方法上面的;这个时候我们把这个注解放到这个test的外面,就不会报错了;
我们下面的这个retention表示这个注解生效的时间,也就是这个注解的生命周期,我们可以看到这个参数里面是有三个可选项的:我们一般写作这个runntime让这个注解的生命周期长一些;
下面的这个就是一个比较完整的演示:这个里面的@interface表示的是一个自定义的注解,我们后面还会遇到,其他的就是我们的元注解;
6.3自定义注解
相关文章:

JavaEE初阶---properties类+反射+注解
文章目录 1.配置文件properities2.快速上手3.常见方法3.1读取配置文件3.2获取k-v值3.3修改k-v值3.4unicode的说明 4.反射的引入4.1传统写法4.2反射的写法(初识)4.3反射的介绍4.4获得class类的方法4.5所有类型的class对象4.6类加载过程4.7类初始化的过程4…...

HarmonyOS一次开发多端部署三巨头之功能级一多开发和工程级一多开发
功能级一多开发与工程级一多开发 引言功能级一多开发SysCaps机制介绍能力集canlUse接口 工程级一多开发三层架构规范 引言 一次开发多端部署 定义:一套代码工程,一次开发上架,多端按需部署 目标:支撑开发者快速高效的开发多终端设…...
STL常用遍历算法
概述: 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小,只包括几个在序列上面进行简…...
前端开发中常见的ES6技术细节分享一
var、let、const之间有什么区别? var: 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是g…...

行业类别-智慧城市-子类别智能交通-细分类别自动驾驶技术-应用场景城市公共交通优化
1.大纲分析 针对题目“8.0 行业类别-智慧城市-子类别智能交通-细分类别自动驾驶技术-应用场景城市公共交通优化”的大纲分析,可以从以下几个方面进行展开: 一、引言 简述智慧城市的概念及其重要性。强调智能交通在智慧城市中的核心地位。引出自动驾驶…...

[High Speed Serial ] Xilinx
Xilinx 高速串行数据接口 收发器产品涵盖了当今高速协议的方方面面。GTH 和 GTY 收发器提供要求苛刻的光互连所需的低抖动,并具有世界一流的自适应均衡功能,具有困难的背板操作所需的 PCS 功能。 Versal™ GTY (32.75Gb/s)&…...

Unity学习笔记(3):场景绘制和叠层设置 Tilemap
文章目录 前言开发环境规则瓦片绘制拐角 动态瓦片总结 前言 这里学一下后面的场景绘制和叠层技巧。 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶|4K:https://www.bilibili.com/video/BV1mL411o77x/?spm_id_from333.10…...
不吹不黑,客观理性深入讨论中国信创现状
1. 题记: 随着美国大选尘埃落定,特朗普当选美国新一任总统,参考他之前对中国政策的风格,个人预计他将进一步限制中国半导体产业和信创产业的发展。本篇博文不吹不黑,客观理性深入探讨中国信创现状。文中数据来自权威媒…...
NoSQL大数据存储技术测试(2)NoSQL数据库的基本原理
写在前面:未完成测试的同学,请先完成测试,此博文供大家复习使用,(我的答案)均为正确答案,大家可以放心复习 单项选择题 第1题 NoSQL的主要存储模式不包括 键值对存储模式 列存储模式 文件…...

「QT」几何数据类 之 QPoint 整型点类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...
植物明星大乱斗5
能帮到你的话,就给个赞吧 😘 文章目录 timer.htimer.cppcamera.hcamera.cppmenuScene.cpp timer.h #pragma once #include <functional>class Timer {public:void reStart();void setTimer(int timerMs);void setIsOneShot(bool isOneShot);void …...

每日算法练习
各位小伙伴们大家好,今天给大家带来几道算法题。 题目一 算法分析 首先,我们应该知道什么是完全二叉树:若一颗二叉树深度为n,那么前n-1层是满二叉树,只有最后一层不确定。 给定我们一棵完全二叉树,我们查看…...
把握鸿蒙生态崛起机遇:开发者如何在全场景操作系统中脱颖而出
把握鸿蒙生态崛起机遇:开发者如何在全场景操作系统中脱颖而出 随着鸿蒙系统的逐步成熟和生态体系的扩展,其与安卓、iOS 形成了全新竞争格局,为智能手机、穿戴设备、车载系统和智能家居等领域带来了广阔的应用前景。作为开发者,如…...

字符串类型排序,通过枚举进行单个维度多个维度排序
字符串类型进行排序通过定义枚举值实现 1.首先创建一个测试类,并实现main方法 2.如果是单个维度的排序,则按照顺序定义一个枚举 public enum Risk {高风险,中风险,一般风险,低风险 } public static void main(String[] args) { }3.main方法里实现如下…...
figma的drop shadow x:0 y:4 blur:6 spread:0 如何写成css样式
figma的drop shadow x:0 y:4 blur:6 spread:0 如何写成css样式 在CSS中,我们可以使用box-shadow属性来模拟Figma中的Drop Shadow效果。box-shadow属性接受的值分别是:横向偏移、纵向偏移、模糊半径、扩展半径和颜色。 但是,Figma的Drop Sha…...

基于Matlab 疲劳驾驶检测
Matlab 疲劳驾驶检测 课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI,通过输入视频,分帧,定位眼睛和嘴巴,通过眼睛和嘴巴的张合度,来判别是否疲劳。 二、操作步骤 第一步:最…...

Linux内核.之 init文件,/init/main.c
想要熟悉内核,看下源码,就非常清晰 Linux内核,head.s,汇编启动cpu相关设置后,启动init文件里的,文件在内核的/init/main.c,看下main函数,做了哪些工作 // SPDX-License-Identifier: …...
CentOS系统中查看内网端口映射的多种方法
在网络管理中,了解和控制内网端口映射是至关重要的。本文将为您详细介绍在CentOS系统中查看内网端口映射的多种方法,助您提升网络管理效率。 使用netstat命令查看端口映射 netstat是一个强大的网络诊断工具。要查看当前的端口映射情况,可以在…...

Mac中禁用系统更新
Mac中禁用系统更新 文章目录 Mac中禁用系统更新1. 修改hosts,屏蔽系统更新检测联网1. 去除系统偏好设置--系统更新已有的小红点标记 1. 修改hosts,屏蔽系统更新检测联网 打开终端,执行命令: sudo vim /etc/hosts127.0.0.1 swdis…...

GoogLeNet-水果分类
GoogLeNet-水果分类 1.数据集 官方下载地址:https://www.kaggle.com/datasets/karimabdulnabi/fruit-classification10-class?resourcedownload 备用下载地址:https://www.123684.com/s/xhlWjv-pRAPh 介绍: 十个类别:苹果、…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...