Java学习之路 —— Java高级
文章目录
- 前言
- 1. 单元测试
- 2. 反射
- 2.1 获取Class对象的三种方式
- 2.2 获取类的构造器的方法
- 2.3 获取类的成员变量
- 2.4 获取类的成员方法
- 2.5 反射的作用
- 3. 注解
- 3.1 自定义注解
- 3.2 注解的原理
- 3.3 元注解
- 3.4 注解的解析
- 4. 动态代理
- 5. 总结
前言
终于走到新手村的末端了,这一部分主要包括了单元测试、发射、注解、动态代理。学完这些就算是走出新手村了,准备去学框架了。
1. 单元测试
就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。
在这之前,都是在Main方法里面编写测试代码,去调用方法进行测试。但这样无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试。同时无法得到测试的报告,需要程序员自己去观察测试是否成功。
于是就有了Junit单元测试框架。
优点
- 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立
- 不需要程序员去分析测试的结果,会自动生成测试报告出来
具体步骤
- 将Junit框架的jar包导入到项目中(IDEA集成了junit框架,不需要手工导入)
- 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
- 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
- 开始测试:选中测试方法,右键选择JUnit运行,如果测试通过是绿色,反之是红色
自己写的一个类
package junit;public class StringUtil {public static void printNumber(String name) {System.out.println("长度是:" + name.length());}public static int getMaxIndex(String data) {if(data == null)return -1;return data.length();}
}
测试类
package junit;import org.junit.Assert;
import org.junit.Test;/*
测试类*/
public class StringUtilTest {// 公开 无返回值 无参数@Test // 测试方法public void testPrintNumber() {StringUtil.printNumber("admin");
// StringUtil.printNumber(null);}@Testpublic void testGetMaxIndex() {int index1 = StringUtil.getMaxIndex(null);int index2 = StringUtil.getMaxIndex("admin");System.out.println(index1 + " " + index2);// 断言机制:程序员可以通过预测业务方法的结果Assert.assertEquals("方法内部有bug", 4, index2);}
}
Emm,,感觉现在我可能用不到,就当了解一下吧。
2. 反射
后面的这些东西都是后面理解框架、学习框架的时候,看底层源码用得到的,所以目前也就当是一个了解吧。
反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
- 反射第一步:加载类,获取类的字节码:Class对象
- 获取类的构造器:Constructor对象
- 获取类的成员变量:Field对象
- 获取类的成员方法:Method对象
2.1 获取Class对象的三种方式
- Class c1 = 类名.class
- 调用Class提供方法:public static Class forName(String package);
- Object提供的方法:public Class getClass(); Class c3 = 对象.getClass();
2.2 获取类的构造器的方法
或许以我现在的知识来看,真是有点脱裤子放屁,还不了解这些的作用。
2.3 获取类的成员变量
获取到成员变量的作用:赋值、取值。
2.4 获取类的成员方法
2.5 反射的作用
- 基本作用:可以得到一个类的全部成分然后操作
- 可以破坏封装性
- 最重要的用途:适合做Java的框架
写一个Demo框架
Student
package reflect;public class Student {private String name;private int age;private char sex;private double height;public Student(String name, int age, char sex, double height) {this.name = name;this.age = age;this.sex = sex;this.height = height;}public String getName() {return name;}
}
框架
package reflect;import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;public class ObjectFrame {public static void saveObject(Object obj) throws Exception {PrintStream ps = new PrintStream(new FileOutputStream("text.txt"));Class c = obj.getClass();String cName = c.getSimpleName(); // 获取类的简单名称ps.println("__________" + cName + "__________");Field[] fields = c.getDeclaredFields();// 遍历每个成员变量for (Field field : fields) {field.setAccessible(true); // 禁止检查访问控制// 拿到成员变量的名字String name = field.getName();// 拿到这个成员变量在对象中的数据String val = field.get(obj) + "";ps.println(name + " = " + val);}ps.close();}
}
测试类
package reflect;import org.junit.Test;public class TestFrame {@Testpublic void save() throws Exception{Student s = new Student("jehan", 21, 'm', 180.5);ObjectFrame.saveObject(s);}
}
结果
3. 注解
注解就是Java代码里面的一些特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序,比如加了注解就执行,没有加注解就不执行,这也是Junit框架的原理。
3.1 自定义注解
public @interface 注解名称 {public 属性类型 属性名() default 默认值;
}
特殊属性名:value
如果注解中只有一个value属性,使用注解时,value名称可以不写
3.2 注解的原理
注解本质是一个接口,继承自Annotation类,里面都是一些抽象方法。
当使用@使用注解的时候,里面的信息都是在创建一个对象,实现了该注解以及Annotation接口。
3.3 元注解
指的是修饰注解的注解。
常用的元注解就2个:
- @Target:声明被修饰的注解只能在哪些位置使用
- @Retention:声明注解的保留周期
3.4 注解的解析
就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。
如何解析注解?
- 要解析类上的注解,就应该先获取该类的Class对象,再通过Class对象解析其上面的注解
- 要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
- Class、Method、Field、Constructor都实现了AnnotatedElement接口,它们都拥有解析注解的能力。
4. 动态代理
动态代理是一种在程序运行时创建目标对象的代理对象,并对目标对象的方法进行功能性增强的技术。这是一种结构设计模式,也称为委托模式。其核心思想在于,当需要对已有的代码(方法)前后添加新功能,而不想修改或不方便修改原代码时,可以利用动态代理来实现。
例如,假设我们有一个Human接口,我和黄牛都实现了这个接口。现在我和黄牛都已经准备好了,怎么把这二者关联起来呢?我们要明确的是黄牛是要帮我买票的,买票必然就需要帮我实现Human接口中的方法。在这种情况下,我们可以创建一个动态代理对象来“委托”黄牛来执行某些功能。
这一块先留个坑吧,后面用到了再好好学一下,就跟着视频敲了一遍demo。
自己写的类
package proxy;public class SuperStar implements Star{private String name;public SuperStar(String name) {this.name = name;}public String sing(String name) {System.out.println(this.name + "正在唱:" + name);return "Thanks";}public void dance() {System.out.println("dancing~");}
}
代理
package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static Star createProxy(SuperStar ss) {// 参数1:默认// 参数2:指定生成的代理长什么样子,也就是有哪些方法// 参数3:指定生成的代理要干什么事情Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{Star.class}, new InvocationHandler() {@Override // 回调方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理对象要做的事情,会在这里写代码if(method.equals("sing")) {System.out.println("准备话筒和场地");} else if(method.equals("dance")) {System.out.println("准备场地, 伴舞");}return method.invoke(ss, args);}});return starProxy;}
}
主函数
package proxy;public class Test {public static void main(String[] args) {SuperStar s = new SuperStar("IU");Star starproxy = ProxyUtil.createProxy(s);String res = starproxy.sing("blueming");System.out.println(res);}
}
5. 总结
花了差不多一周,把Java全部过完了一遍,目前后面的计划安排是每天刷几道力扣,进一步熟悉熟悉Java,然后去学JavaWeb吧,大概就是这样,也希望能在12月之前开到奖,这样我想是今年生日送给我的最好的一份礼物了。后面我会把一些写好了的面经帖和我这一年的一个经历与心路历程发出来,本来想着就不发了,但是还是有一些朋友私信我希望我能够分享一下,那后面就整理一下发吧。我也不知道后面还有多少机会去产出博客,也是希望给后来者一条清晰的路吧,大学生最大的敌人是信息差。
So,有缘再见吧,Bye~
相关文章:

Java学习之路 —— Java高级
文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言 终于走到新手村的末端了,…...

git使用及常用命令
在初入公司中,若使用的是git管理工具,需要做以下步骤: 1,常用命令在: (1),git config --global user.name xxx(名字) //若不设置 那么下次提交代码时会报错 其次该设置名字和…...

vue 学习 -- day36(分析工程结构)
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数 import { createApp } from vue import App from ./App.vue //创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”,它少了很多属性和方法) const app creat…...

SQL Injection
SQL Injection SQL injection(SQL注入),通过在输入字段或URL查询参数中执行SQL命令,导致对数据库的未经授权的访问。如果SQL注入成功,未经授权的人可能会读取、创建、更新甚至删除数据库表的记录 举个例子:…...

【Go入门】 Go搭建一个Web服务器
【Go入门】 Go搭建一个Web服务器 前面小节已经介绍了Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,…...

VS 将 localhost访问改为ip访问
项目场景: 使用vs进行本地调试时需要多人访问界面,使用ip访问报错 问题描述 vs通过ip访问报错 虚拟机或其它电脑不能正常打开 原因分析: 原因是vs访问规则默认是iis,固定默认启动地址是localhost 解决方案: 1.vs项目启动之后会出现这个 右…...

app使用
font-face{font-family:‘kaishu’; src: url(data:application/font-ttf;charsetutf-8;base64,AAEAAAASAQAABAAgRFNJR5PpVzIAAAEsAAAacEdTVUIzhvftAAAbnAAAAXBPUy8yY8pHoQAAHQwAAABWY21hcAsTB9YAAB1kAADD5GN2dCAvAiIAADhSAAAA5pmcGdt/siFHQAA5OQAAAOiZ2FzcAAXAAkAAOiIAAAAEGds…...

【迅搜01】安装运行并测试XunSearch
安装运行并测试XunSearch 这回的新系列,我们将学习到的是一个搜索引擎 迅搜 XunSearch 的使用。这个搜索引擎在 PHP 圈可能还是有一点名气的,而且也是一直在更新的,虽说现在 ElasticSearch 已经是实际上的搜索引擎霸主了,而且还有…...

Mac电脑VSCode配置PHP开发环境
1.安装 PHP 首先,打开终端,安装 Homebrew,输入如下命令: $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装了 Homebrew 之后,你可以使用下面的…...

SpirngBoot + Vue 前后端分离开发工具代码
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

【数据结构初阶】单链表(附全部码源)
单链表 1,单链表的概念及结构2,单链表的实现2.1初始化内容(所需文件,接口)2.2申请结点2.3打印单链表2.4尾插2.5头插2.6尾删2.7头删2.8查找2.9在pos位置之后插入2.10在pos位置前面插入2.11删除pos之后的值2.12删除pos位…...

数据治理入门
处理模式 模式名称常见场景常见框架批处理夜间几个小时,无人值守hive spark datax流处理7*24H一直运行,无人值守maxwell, flink, flume, kafka即席处理人机交互接口访问 web页面 数据治理的意义 数据质量低:数据错误,不准确或不…...

uniapp 微信小程序登录 新手专用 引入即可
预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…...

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰
说明 本文作为PMCW体制雷达系列文章之一,主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域,对于一切以电磁波作为媒介的信息传递活动,干扰是无处不在的。近年来,随着雷达装车率的提高,…...

Gin框架源码解析
概要 目录 Gin路由详解 Gin框架路由之Radix Tree 一、路由树节点 二、请求方法树 三、路由注册以及匹配 中间件含义 Gin框架中的中间件 主要讲述Gin框架路由和中间件的详细解释。本文章将从Radix树(基数树或者压缩前缀树)、请求处理、路由方法树…...

MacOS设置JAVA_HOME环境变量
首先先查看一下,系统当前使用的java是谁,可以使用/usr/libexec/java_home命令 % /usr/libexec/java_home /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home检查一下这个路径下的文件,发现这是一个jre的目录。加上-V参数看…...
闭眼检测实现
引言 这段代码是一个实时眼睛状态监测程序,可以用于监测摄像头捕获的人脸图像中的眼睛状态,判断眼睛是否闭合。具体应用实现作用说明如下: 1. 实时监测眼睛状态 通过摄像头捕获的实时视频流,检测人脸关键点并计算眼睛的 EAR&a…...

系列六、Java垃圾回收器主要有哪些?
一、Java垃圾回收器主要有哪些? UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParallelNewGC、UseParallelOldGC、UseG1GC...

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
目录 【7】Spring Boot 3 集成组件:缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…...

说说Java中的不可重入锁
什么是锁? 简单来讲在Java中,锁是一种用于并发控制的机制,用于保护共享资源,防止多个线程同时访问或修改数据导致的数据不一致性和线程安全问题。在Java虚拟机(JVM)中,每个对象都有一个相关联的…...

C++学习 --vector
目录 1, 什么是vector 2, 创建vector 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作vector 3-1, 赋值 3-2, 添加元素 3-2-1, 添加元素(assi…...
Android图片涂鸦,Kotlin(1)
Android图片涂鸦,Kotlin(1) import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.PointF import android.…...

upload-labs(1-17关攻略详解)
upload-labs pass-1 上传一个php文件,发现不行 但是这回显是个前端显示,直接禁用js然后上传 f12禁用 再次上传,成功 右键打开该图像 即为位置,使用蚁剑连接 连接成功 pass-2 源码 $is_upload false; $msg null; if (isse…...

《 机器人基础 》期末试卷(A)
一、填空题(30分,每空2分) 1. 按照相机的工作方式,机器人常用相机分为1)__ 单目摄像头 2)__ 双目摄像头 _ 3)_深度摄像头_ 三类。 2. 度量地图强调…...

Azure Machine Learning - Azure AI 搜索中的矢量搜索
矢量搜索是一种信息检索方法,它使用内容的数字表示形式来执行搜索方案。 由于内容是数字而不是纯文本,因此搜索引擎会匹配与查询最相似的矢量,而不需要匹配确切的字词。本文简要介绍了 Azure AI 搜索中的矢量支持。 其中还解释了与其他 Azure…...

3 redis实现一个消息中间件
使用list实现一个队列,可以从左侧入队,也可以从右侧入对 即可以从左侧读取,也可以从右侧读取 1、Lindex Lindex 命令用于通过索引获取列表中的元素 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的…...

js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。
遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…...

C语言结构体
#include <stdio.h> #include <string.h> #include <stdlib.h>//struct Student_s { // int num; // char name[20]; // char gender; // int age; // float Chinese; // float Math; // float English; // char addr[30]; //}; //最后的分号一定要写&#x…...

【Python大数据笔记_day10_Hive调优及Hadoop进阶】
hive调优 hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时,不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率,或帮助定位问…...

React经典初级错误
文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…...