目录

 昨日总结

今日计划

算法——螺旋矩阵||

反射

利用反射方法给对象赋值流程

注意

Java的代理模式(未完,与AOP一起对应看)

三种代理模式

昨日八股联想答案 

今日八股联想

计算机视觉

总结


 昨日总结

  • 总结了反射和Java代理模式(‘未完’),完成地址簿模块和用户下单功能
  • 背诵小林coding--Java基础面试题部分(4/4)<二次>
  • 看了摘要部分
  • 代码随想录--螺旋矩阵||

今日计划

  • 了解Spring AOP编程,继续总结Java代理模式,继续跟进项目
  • 背诵小林coding--Java集合面试篇(1/4)
  • 继续翻译
  • 代码随想录--移除链表元素

算法——螺旋矩阵||

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

用c写要注意动态创建数组,同时结束时,要返回数组的大小。

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
    //先申请数组空间
    int** result = malloc(sizeof(int*) * n);
    for (int i = 0; i < n; i++) {
        result[i] = malloc(sizeof(int) * n);
    }
    int start_x = 0,start_y = 0; //定义循环每一圈的起始位置
    int loop = n / 2;  //每个圈循环几次,注意奇数的情况最后另讨论
    int count = 1;
    int flag = 1;
    int i , j;
    while (loop--){
        i = start_x;
        j = start_y;
        //左到右情况
        for (j = start_y; j < n - flag; j++){
            result[i][j] = count++;
        }
        //上到下情况
        for (i = start_x; i < n - flag; i++){
            result[i][j] = count++;
        }
        //右到左情况
        for (; j > start_y; j--){
            result[i][j] = count++;
        }
        //下到上情况
        for(; i > start_x; i--){
            result[i][j] = count++;
        }
        start_x++;
        start_y++;
        flag++;
    }
    if (n % 2){
        result[n/2][n/2] = count;
    } 
     *returnSize = n;
    *returnColumnSizes = malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) {
        (*returnColumnSizes)[i] = n;
    }
    return result;
}

反射

就是把java类中的各个成分映射成Java对象。存在于运行状态中。对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。(使用的前提是得到字节码文件)

利用反射方法给对象赋值流程

  • 当我们new一个对象时,jvm就是加载我们所创建对象的字节码文件。反射的本质理解就是得到class对象后,反向获取对象的各种信息
  • 首先,要获取Class对象(获取Class对象的三种方式如下)
package com.qdd;
 
public class demo {
    public static void main(String[] args) throws ClassNotFoundException {
	 //方式1:通过类名
        Class class1 = Student.class;
        //方式2:通过Class类的forName()方法,注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
        Class class2 = Class.forName("com.qdd.Student");
        //方式3:通过对象调用getClass()方法
        Student student = new Student("姓名");
        Class class3 = student.getClass();
    }
}
class Student{
    private String name;
 
    public Student(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
  • 用class对象调用newInstance()方法获取反射对象
Object object = Class对象.getConstructor().newInstance();
  • 用getField方法获取公有字段,并用set方法对其赋值
Field StuName = stuClass.getField("name");
StuName.set(object,"小明");
  • 以上便是通过反射方法实现对共有字段赋值,除此之外,反射还可以用在获取成员方法并调用、运行配置文件、运行时类型信息、加载类等等

注意

反射可能会破坏封装性、引发代码注入风险、造成信息泄露问题,引发一系列安全问题。在有安全策略限制的系统中,应加强对反射使用的监控和控制,确保反射操作不会绕过安全策略。

Java的代理模式(未完,与AOP一起对应看)

代理模式是一种结构性设计模式,代理对象作为一个中间层,对真实对象的操作进行拦截或者增添额外的功能,提高系统间接性和灵活性。代理模式作为结构型设计模式之一,广泛应用于各种场景。其核心思想是通过引入代理对象,为目标对象的访问提供一种间接方式,这种间接性不仅提升了代码的扩展性和维护性,还为功能的增强和安全控制提供了便利。

三种代理模式

  1. 静态代理
在编译时就确定了代理类的结构,只能静态代理某些类和方法,功能较弱
定义一个接口——>被代理类和代理类继承公共接口——>生成代理对象,构造方法里初始化类型的对象,传给代理对象——>代理对象调用重写的方法

Proxy动态代理

  1. Proxy动态代理
在运行时动态生成代理类
  1. CGLIB动态代理(子类代理)

昨日八股联想答案 

  • Lambda表达式

Lambda 表达式它是一种简洁的语法,用于创建匿名函数,主要用于简化函数式接口,可以用更简洁的语法实现相同的功能。虽然 Lambda 表达式优点蛮多的,不过也有一些缺点,比如会增加调试困难,因为 Lambda 表达式是匿名的,在调试时很难定位具体是哪个 Lambda 表达式出现了问题。

  • Stream流

它允许你以声明式的方式处理数据集合(如 List、Set 等)。可以把 Stream 想象成一个传送带,数据元素就像传送带上的物品,在传送过程中可以对这些物品进行筛选、排序、映射等操作,而不需要手动编写迭代循环。

  • 代理模式和适配器模式区别

目的不同:代理模式关注控制对象的访问,适配器模式则用于接口转换,是不兼容的类能够一起工作。

应用场景不同:代理模式常用于添加额外功能,适配器模式常用语不兼容接口的协同工作

今日八股联想

  • 有哪些集合,与数组的区别
  • 集合遍历的方法有哪些
  • Arraylist和LinkedList的区别,哪个集合是线程安全的?

计算机视觉

总结

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐