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单元测试框架。

优点

  • 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立
  • 不需要程序员去分析测试的结果,会自动生成测试报告出来

具体步骤

  1. 将Junit框架的jar包导入到项目中(IDEA集成了junit框架,不需要手工导入)
  2. 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
  3. 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
  4. 开始测试:选中测试方法,右键选择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);
    }
    @Test
    public void testGetMaxIndex() {
        int index1 = StringUtil.getMaxIndex(null);
        int index2 = StringUtil.getMaxIndex("admin");
        System.out.println(index1 + " " + index2);

        // 断言机制:程序员可以通过预测业务方法的结果
        Assert.assertEquals("方法内部有bug", 4, index2);
    }
}

在这里插入图片描述

Emm,,感觉现在我可能用不到,就当了解一下吧。

2. 反射

后面的这些东西都是后面理解框架、学习框架的时候,看底层源码用得到的,所以目前也就当是一个了解吧。

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)

  1. 反射第一步:加载类,获取类的字节码:Class对象
  2. 获取类的构造器:Constructor对象
  3. 获取类的成员变量:Field对象
  4. 获取类的成员方法: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 {
    @Test
    public 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~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

青少年CTF-WEB-Flag在哪里?

题目环境:F12查看源代码得到flag:qsnctf{1167716c-54f0-47da-baed-49e3b08dfaeb} 此题主要考察F12查看源代码的使用

java.net.UnknownHostException: eureka

java.net.UnknownHostException: eureka 哦。HOST漏了 #linux /etc/hosts #windows C:\Windows\System32\drivers\etc\hosts 127.0.0.1 eureka7000 127.0.0.1 eureka7001 127.0.0.1 eureka7002

MATLAB画图分辨率、图像大小研究

MATLAB画图分辨率、图像大小研究 Figure属性中 InnerPosition Position OuterPosition区别画图与打印的分辨率和图像大小研究首先明确两个概念:MATLAB实操画图 Figure属性中 InnerPosition Position OuterPosition区别 在画图的时候,我们经常需要设置Fi…

Leetcode—142.环形链表II【中等】

2023每日刷题(三十三) Leetcode—142.环形链表II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* …

python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例

文章目录 前言1. 数据清洗:使用 sklearn.preprocessing 中的 StandardScaler 和 MinMaxScaler 进行数据规范化。2. 缺失值处理:使用 sklearn.impute 中的 SimpleImputer 来填充缺失值。3. 数据编码:使用 sklearn.preprocessing 中的 OneHotEn…

【左程云算法全讲13】暴力递归

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考…

Springboot集成JDBC

1&#xff0c;pom.xml配置jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> 2&#xff0c;配置数据源信息 server:port: 8088spring:datasource:dr…

AI智剪:批量剪辑实战,技巧与实例

随着人工智能技术的不断发展&#xff0c;越来越多的领域开始应用AI技术提升工作效率和质量。其中&#xff0c;AI智剪技术在视频剪辑领域的应用也越来越广泛。AI智剪是一种基于人工智能技术的视频剪辑方法&#xff0c;通过机器学习算法对视频进行自动分析和处理&#xff0c;实现…

AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

TCP协议相关实验

文章目录 一.TCP相关实验1.理解CLOSE_WAIT状态2.理解TIME_WAIT状态3.解决TIME_WAIT状态引起的bind失败的方法4.理解listen的第二个参数5.使用Wireshark分析TCP通信流程 二.TCP与UDP1.TCP与UDP对比2.用UDP实现可靠传输&#xff08;经典面试题&#xff09; 一.TCP相关实验 1.理解…

操作系统·进程同步

进程同步&#xff1a;异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待&#xff0c;使得各进程按照一定的速度执行的过程。 进程同步的主要任务是使并发执行的诸进程之间能有效地共享资源和相互合作&#xff0c;使执行的结果具有可再现性。 4.1 进程同…

LeetCode——字符串(Java)

字符串 简介[简单] 344. 反转字符串[简单] 541. 反转字符串 II[中等] 151. 反转字符串中的单词 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如果有错误&#xff0c;可以在评论区提醒一下。 [简单] 344. 反转字符串…

9 STM32标准库函数 之 独立看门狗(IWDG)所有函数的介绍及使用

9 STM32标准库函数 之 独立看门狗&#xff08;IWDG&#xff09;所有函数的介绍及使用 1. 图片有格式该文档修改记录&#xff1a;总结 函数描述格式&#xff1a; 函数名外设函数的名称函数原形原形声明功能描述简要解释函数是如何执行的输入参数{x}输入参数描述输出参数{x}输出…

sqli-labs关卡20(基于http头部报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第二十关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚…

HLS基础issue

hls 是一个用C/c 来开发PL &#xff0c;产生rtl的工具 hls是按照rtl code来运行的 &#xff0c; 但是rtl会在不同器件调用不同的源语&#xff1b; 可能产生的ip使用在vivado另外一个器件的话 会存在问题&#xff1b; Hls &#xff1a; vivado ip &#xff0c; vitis kernel 是…

Os-hackNos-1

Os-hackNos-1 一、主机发现和端口扫描 主机发现 arp-scan -l端口扫描 nmap -P 192.168.80.141二、信息收集 访问80端口&#xff0c;可知目标是ubuntu系统&#xff0c;中间件是Apache 目录扫描&#xff0c;发现两个路径 dirsearch -u http://192.168.80.141/ -e *index.html路…

VPN创建连接 提示错误 628: 在连接完成前,连接被远程计算机终止。

提示错误 628: 在连接完成前&#xff0c;连接被远程计算机终止。 需要把这个地址配置一下&#xff1a; VPN类型&#xff1a;点对点PPTP 数据加密&#xff1a;如果没有加密的话&#xff0c; 要把这个选一下。

这个双11,阿里云经历了可能是历史级的大故障!

2023年11月12日17&#xff1a;44开始&#xff0c;阿里云发生严重故障&#xff0c;导致阿里巴巴大量产品无法连接&#xff0c;一时间&#xff0c;“阿里云盘崩了”、“淘宝又崩了”、“闲鱼崩了”、“钉钉崩了”等话题相继登上热搜。 此外&#xff0c;像纳思云充电桩、乐爽coole…

初识Linux:目录的创建销毁

目录 ​编辑 提示&#xff1a;以下指令均在Xshell 7 中进行 零、桌面的本质 &#x1f4bb; 扩展&#x1f387;&#xff1a; 一、cd指令&#xff1a; 1、cd - &#xff1a; 2、cd ~&#xff1a; 重命名命令&#xff1a;alias 二、stat指令 冷知识&#xff1a; 如果…

Python编程技巧 – 对象和类

Python编程技巧 – 对象和类 Python Programming Skills – Object and Class Python是一种面向对象的高级程序语言。 本文简要介绍用Python如何实现面向对象&#xff0c;对象和类的声明及使用&#xff0c;以及面向对象的特征&#xff0c;及其如何使用属性和方法的介绍&#x…