动态代理和反射
动态代理和反射由于这两个东西很重要经常用,所以我专门用一个文章来讲解,忘了就看着一个就够了
反射反射机制就是在 运行的时候 获取类的结构信息,比如方法,字段,构造函数并操作对象的一种机制。
反射操作相对于静态调用有比较高的性能开销,因为他涉及到动态解析和方法调用。所以在性能敏感的场景中,尽量避免使用反射。可以通过 缓存反射结果 避免反射性能问题。
反射主要有个Class类,通过Class类的实例可以获取类的各种信息。
反射的主要主要功能:
创建对象:通过Class.newInstance 或者Constructor.newInstance()创建对象实例
访问字段:通过Field类访问和修改对象的字段。
调用方法:使用Method类调用对象的方法
获取类对象:获取类的名称、父类、接口等信息。
类的元数据存在方法区 / 元空间,Class 实例存在堆中,反射通过堆中的 Class 实例,访问方法区的元数据,进而操作对象。
动态代理首先了解静态代理
一个租房子问题,中介就是这个原理。
缺点代理需要手动创建,简单来说就是房主和中介都要实现租房接口,这个租房接口规定了租房的规范,然后消 ...
算法理解(口语化)
算法理解(口语化)前导要学算法首先要熟悉 IO 模板这里先提前学 IO模板
提前告诉数据量的类型
1234567891011121314151617181920import java.io.*;import java.util.*;public class Main{ //这里注意要抛出异常 public static void main(String[] args) throws IOException{ //注意输入和输出流 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); while(in.nextToken() != S ...
Spring扩展点案例
Spring扩展点案例首先Spring扩展点有三个
1、BeanPostProcessor这个可以在Bean实例前后进行增强
2、BeanFactoryPostProcessor这个是用来修改Bean的元数据的
3、FactoryBean是通过java来进行初始化而不是xml
创建一个Bean的流程
我们模拟一个 “订单服务(OrderService)” 的开发场景,流程如下:
FactoryBean:封装 OrderService 的复杂初始化(比如加载订单模板配置、初始化缓存)。
BeanFactoryPostProcessor:在 OrderService 实例化前,动态修改其元数据(比如根据环境切换订单超时时间)。
BeanPostProcessor:在 OrderService 初始化后,增强其方法(比如添加订单操作的日志记录)。
整个项目是标准 Spring Boot 结构,靠 @SpringBootApplication 自动启动容器,无需手动创建 ApplicationContext。
实际案例1、首先有一个核心业务类
123456789101112131415 ...
JavaEE
JavaEE首先JavaEE就是在之前JavaSE本地运行的基础上,增加了企业级Web应用中的技术标准,也就是说现在JavaEE可以开发WEB应用了。
JavaEE平台包含了13个技术规范
JAVEE阶段需要学习的核心技能
Servlet、JSP、JSTL/EL、JavaBean、MVC模式、过滤器Filter、监听器listener、Ajax 分页
然后既然是JavaEE开发那么就需要有个服务器,然后再利用JavaEE的库来开发web项目,然后常用的Web容器有Tomcat和Jetty
WEB应用运行流程:
用户访问 http://localhost:8080/hello
请求到达 Tomcat(Web 容器)
Tomcat 根据 web.xml 或注解,找到对应的 Servlet
Servlet 处理请求,可能调用 Service → DAO → 数据库
处理完成后,跳转到 JSP 页面(View)
JSP 被编译成 Servlet,结合 JSTL/EL 渲染 HTML
返回 HTML 响应给浏览器
Filter 可能在请求前后做日志、编码、权限检查
Listener 可 ...
Spring
Spring核心技术Spring框架的控制反转IoC 容器。
Spring面相切面编程 AOP 技术。
此外还有Spring和AspectJ
IOC容器Spring IoC容器和Bean简介原本是 “对象自己找依赖”(比如 A 类要用到 B 类,A 自己 new B、自己找 B 的实例),现在是 “容器给对象送依赖”(A 不用管 B 怎么来,容器提前准备好 B,在创建 A 时主动 “塞” 给 A)—— 这种 “找依赖的权力从对象手里转到容器手里” 的反转,就是 IoC;而容器 “塞依赖” 的具体动作,就是 DI(依赖注入)
IoC 是 “设计原则”(核心思想是 “反转依赖控制权”),DI 是 “实现方式”(具体怎么把依赖给对象)—— 二者本质是同一概念的不同角度描述,Spring 用 DI 的方式实现了 IoC 原则。
一个对象(比如 A 类)要和其他对象(比如 B 类、C 类,也就是 A 的 “依赖”)合作,不用自己去创建或查找这些依赖,只需要 “明确告诉容器自己需要什么”—— 告诉的方式有 3 种:
构造参数:A 的构造方法里写public A(B b) { ... & ...
Netty
NettyBIO、NIO、AIO 的区别BIO、AIO和NIO是Java中不同的I/O模型,它们在处理输入输出操作时有不同的特点。
BIO: 阻塞式的I/O模型。当一个线程执行I/O操作时,如果数据还没准备好,这个线程会被阻塞,直到数据到达。适合连接数较少且固定的场景,但扩展性较差。在Java中用ServerSocket和Socket的accpet方法,用来阻塞,等待客户端连接。
NIO: 非阻塞的I/O模型。NIO使用缓冲区和通道来处理数据,提高了I/O操作的效率。支持面向缓冲区的读写操作,可以处理大量并发的连接。在java.nio包中提供了Selector、Channel等类实现高效的非阻塞IO
AIO: 异步I/O模型,从Java 7开始引入。在AIO中,I/O操作被发起后,线程可以继续执行其他任务,一旦I/O操作完成,操作系统会通知线程。适合需要处理大量并发I/O操作,且希望避免I/O操作阻塞线程的场景。在Java中通过AsynchronousSocketChannel类来实现异步IO
使用场景:
BIO适合低并发、连接数较少的应用。
NIO适合高并发、需要处理大量连接的应用 ...
RPC了解
RPC了解定义RPC = Remote Procedure Call 远程过程调用
简单来说像调用本地方法一样,调用远程服务器上的方法。
常见的RPC框架
Dubbo
阿里巴巴
国内最流行,功能强大,集成 ZooKeeper
gRPC
Google
跨语言,高性能,使用 Protobuf 和 HTTP/2
Thrift
Apache
Facebook 开源,支持多语言
Spring Cloud OpenFeign
Spring
基于 HTTP 的轻量级 RPC
RPC核心组件
组件
作用
动态代理
让调用远程方法像调用本地方法一样
序列化/反序列化
把对象转成字节流在网络上传输(如 JSON、Protobuf、Hessian)
网络通信
使用 TCP/HTTP 传输数据(如 Netty、OkHttp)
服务发现
找到服务端的 IP 和端口(如 ZooKeeper、Nacos)
负载均衡
多个服务实例时,选择哪个调用(如轮询、随机)
为什么需要RPC
在单体应用中,所有代码在一个进程里,方法调用是“本地调用”。
但在 ...
Java线程池的原理
Java线程池的原理线程池是一种池化技术,用于创建和管理线程,避免频繁的创建和销毁,提高性能和响应速度。
Java线程池有几个核心参数
1、核心线程数
2、最大线程数
3、工作队列
4、最大空闲时间
5、拒绝策略
主要工作原理如下
1、默认情况下是不会创建线程的,只有当任务提交也就是执行了submit方法之后才会创建线程
2、当核心线程数满了之后,也不会新建线程,而是把任务堆积在工作队列中
3、当核心线程满了,并且工作队列也满了才会创建新线程
4、当核心线程满了,并且超过最大线程数的时候就会采取拒绝策略
5、当线程运行一段时间,存在空闲线程的时候,如果空闲线程超过最大空闲时间就会销毁线程,直到线程数等于核心线程数才停止销毁。
通常会使用自定义线程池,一般通过java.util.concurrent.ThreadPoolExecutor构造函数
123456789public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long k ...








