java
文章平均质量分 92
-无-为-
做过开发,创过业,踩过坑。从Java后台开发,PL/SQL开发,Pro*C开发,到shell脚本,再到兼职开发的MySQL DBA。
为人友善诚恳,工作踏实,吃苦耐劳,富有朝气,激情,以及团队合作意识。
https://github.com/zhouxx1055
https://zhouxx.blog.csdn.net/
展开
-
科普文:Java面试一问一答系列之九
锁是多线程编程中的同步机制,用于控制多个线程对共享资源的访问。锁可以防止多个线程同时访问临界区,从而保证数据的一致性和正确性。ReentrantLock: 是一个可重入的锁,支持公平和非公平两种模式。它提供了更丰富的功能,如条件变量、可中断的锁获取以及超时获取等。synchronized: 是Java中的内置锁,用于实现基本的同步。每个对象都有一个内置的监视器锁,可以通过synchronized关键字来获取和释放锁。死锁是指多个线程相互等待彼此持有的资源而无法继续执行的情况。原创 2024-08-20 00:25:42 · 901 阅读 · 0 评论 -
科普文:Java面试并发编程一问一答系列之八
BlockingQueue接口是Queue的子接口,它的主要用途并不是作为容器,而是作为线程同步的的工具,因此他具有一个很明显的特性,当生产者线程试图向BlockingQueue放入元素时,如果队列已满,则线程被阻塞,当消费者线程试图从中取出一个元素时,如果队列为空,则该线程会被阻塞,正是因为它所具有这个特性,所以在程序中多个线程交替向BlockingQueue中放入元素,取出元素,它可以很好的控制线程之间的通信。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。原创 2024-08-17 00:05:57 · 660 阅读 · 0 评论 -
科普文:Java面试基础一问一答系列之七
它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 vhost 中)。原创 2024-08-17 00:05:19 · 556 阅读 · 0 评论 -
科普文:Java面试基础一问一答系列之六
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。原创 2024-08-17 00:04:32 · 908 阅读 · 0 评论 -
科普文:Java面试基础一问一答系列之五
JVM 调用方法是通过方法签名来判断到底要调用哪个方法,而方法签名 = 方法名称+参数类型+参数个数组成的一个唯一值,这个唯一值就是方法签名。方法重载:在同一个类中定义多个方法,它们具有相同的名称但参数列表不同。方法重写:发生在两个类之间,这两个类具有父子关系,也就是子类继承父类。当子类需要改变从父类继承来的方法的行为时,子类可以定义一个与父类方法签名完全相同(方法名、参数列表、返回类型)的方法,这样,子类就重写了父类的方法。原创 2024-08-15 00:11:04 · 692 阅读 · 0 评论 -
科普文:Java基础系列之【线程池Executors类的9种创建线程池的方法及应用场景分析】
在Java中,Executors 类提供了多种静态工厂方法来创建不同类型的线程池。: 创建一个可缓存的线程池,如果线程池中的线程超过60秒没有被使用,它们将被终止并从缓存中移除。: 创建一个固定大小的线程池,其中 nThreads 指定了线程池中线程的数量。: 创建一个单线程的执行器,它创建单个工作线程来执行任务。: 创建一个固定大小的线程池,它可以根据需要创建新线程,但会按照固定延迟执行具有给定初始延迟的任务。: 创建一个工作窃取线程池,它使用多个队列,每个线程都从自己的队列中窃取任务。原创 2024-08-15 00:09:58 · 668 阅读 · 0 评论 -
科普文:Java基础系列之【线程池参数调优与技巧】
Java 中的线程池实现在Executor:线程池顶层接口,定义了线程池的 execute()方法,提交任务到线程池去执行。:线程池的具体实现接口,通过 submit()方法向线程池提交任务,返回 Future,可以通过 Future 获得任务的执行情况。:实现类似于 Timer 的计划任务调度功能。:是 ExecutorService 的一个实现类,也是 Java 中的线程池实现的核心实现类。通常情况下,我们是使用 ThreadPoolExecutor 来实现线程池功能。原创 2024-08-15 00:09:22 · 909 阅读 · 0 评论 -
科普文:Java基础系列之【Java代码性能优化实践】
Java 性能优化是一个涵盖代码编写、内存管理、垃圾回收、数据库访问等多个方面的过程。结合实际案例不断进行实践与总结,并依据实际情况采用适当的优化策略。在实际编码过程中,保持对性能优化的关注,不断反思和改进代码,有助于获得高性能 Java 应用。Java 作为一种广泛应用的编程语言,性能优化在很大程度上决定了程序的运行效率。优化 Java 性能可以大幅提高程序执行速度、减少程序资源占用,从而满足现代复杂软件系统的需求。本文将介绍一些 Java 性能优化的关键技术和实践要点。原创 2024-08-15 00:08:52 · 1189 阅读 · 0 评论 -
科普文:Java基础系列之【JUC常见的java并发容器原理解析与应用】
在Java中,并发容器是专门设计用于多线程环境的数据结构,能够提供线程安全的操作。除了以上7种并发容器,还有CopyOnWriteArrayList,来代替Vector、synchronizedList,CopyOnWriteArraySet来代替synchronizedSet,基于CopyOnWriteArrayList实现,ConcurrentSkipListSet可以代替synchronizedSortedSet,内部基于ConcurrentSkipListMap实现。前面的文章有对JUC下的并发原创 2024-08-15 00:08:17 · 464 阅读 · 0 评论 -
科普文:Java基础系列之【java正则表达式】
在java中,通过适当命名的Pattern类可以容易确定String是否匹配某种模式.模式可以象匹配某个特定的String那样简单,也可以很复 杂,需要采用分组和字符类,如空白,数字,字母或控制符.因为Java字符串基于统一字符编码(Unicode),正则表达式也适用于国际化的应用程序.首先一个Pattern实例订制了一个所用语法与 PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。)的更复杂的模式上.原创 2024-08-14 12:11:33 · 865 阅读 · 0 评论 -
科普文:Java基础系列之【java框架基础:字节码增强技术框架ASM#ClassReader实现原理及源码分析】
ASM是Java中比较流行的用来读写字节码的类库,用来基于字节码层面对代码进行分析和转换。在读写的过程中可以加入自定义的逻辑以增强或修改原来已编译好的字节码,比如CGLIB用它来实现动态代理。ASM被设计用于在运行时对Java类进行生成和转换,当然也包括离线处理。ASM短小精悍、且速度很快,从而避免在运行时动态生成字节码或转换时对程序速度的影响,又因为它体积小巧,可以在很多内存受限的环境中使用。它又一个很小,但设计良好并且模块化的API,且易于使用。它具有很好的文档,并且还有eclipse插件。原创 2024-08-14 04:05:58 · 664 阅读 · 0 评论 -
科普文:Java基础系列之【java框架基础:字节码增强技术框架ASM】
之前的文章我们介绍了字节码的基础知识,今天我们将介绍字节码相关的应用场景,首先要介绍的是如何对字节码做解析和修改,本文将会详细给大家介绍一个工业级字节码操作框架 ASM。当我们需要对一个 class 文件做修改时,我们可以选择自己解析这个class 文件,在符合 Java 字节码规范的前提下进行字节码改造。如果你写过 class 文件的解析程序,会发现这个过程极其繁琐,更别说进行增加方法等操作了。原创 2024-08-14 03:58:21 · 768 阅读 · 0 评论 -
科普文:Java基础系列之【java框架基础:Java字节码修改 - javassist】
字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。以下是一些常见的Java前面介绍了asm库对字节码的修改和增强。AOP的实现一般使用了动态代理和字节码修改,本文介绍使用javassist实现类的创建和修改。原创 2024-08-13 23:40:55 · 350 阅读 · 0 评论 -
科普文:Java基础系列之【java框架基础:性能优化-JVM字节码】
前面我们通过tomcat本身的参数以及jvm的参数对tomcat做了优化,其实要想将应用程 序跑的更快、效率更高,除了对tomcat以及jvm优化外,应用程序代码本身如果写的效率不高的,那么也是不行的,所以,对于程序本身的优化也就很重要了。所以,可以得出结论,字符串拼接,+号和StringBuilder是相等的,效率一样。StringBuffer是保证线程安全的,效率是比较低的,我们更多的是使用场景是不会涉及到线程安全的问题的,所以更多的时候会选择StringBuilder,效率会高一些。原创 2024-08-13 23:36:01 · 774 阅读 · 0 评论 -
科普文:Java基础系列之【java框架基础:字节码增强】
ASM 提供了和其他字节码框架相似的功能,整个类包非常小,不到120KB,但其非常注重对类字节码的操作速度。在java代码被编译为字节码之后,java才能号称“一次编译,到处运行”,所以你掌握了字节码技术,你就掌握了java?魔数、版本号、常量定义、访问标志、类索引、父类索引、接口个数和索引表、字段个数和索引表、方法个数和索引表、属性个数和索引表。通过这个树形结构,开发者可以方便地分析和修改字节码,而不需要直接操作字节码数组。字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。原创 2024-08-13 23:31:44 · 643 阅读 · 0 评论 -
科普文:Java基础系列之【集合HashMap 源码分析】
从putVal源代码中我们可以知道,当插入一个元素的时候size就加1,若size大于threshold的时候,就会进行扩容。假设我们的capacity大小为32,loadFator为0.75,则threshold为24 = 32 * 0.75,此时,插入了25个元素,并且插入的这25个元素都在同一个桶中,桶中的数据结构为红黑树,则还有31个桶是空的,也会进行扩容处理,其实,此时,还有31个桶是空的,好像似乎不需要进行扩容处理,但是是需要扩容处理的,因为此时我们的capacity大小可能不适当。原创 2024-08-13 01:28:03 · 799 阅读 · 0 评论 -
科普文:Java基础系列之【集合Vevtor和Stack 源码分析】
通过API中可以知道:1)Vector是一个可变化长度的数组2)Vector增加长度通过的是capacity和capacityIncrement这两个变量,目前还不知道如何实现自动扩增的,等会源码分析3)Vector也可以获得iterator和listIterator这两个迭代器,并且他们发生的是fail-fast,而不是fail-safe,注意这里,不要觉得这个vector是线程安全就搞错了,具体分析在下面会说。原创 2024-08-13 01:21:43 · 945 阅读 · 0 评论 -
科普文:Java基础系列之【集合LinkedList 源码分析】
LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的,是线程不安全的,允许元素为null的双向链表。双向链表O(1),查询相对较慢O(n)链表结构,所以分配的空间不要是连续的线程不安全E item;//节点数据//指向下一节点的指针//指向上一节点的指针//节点LinkedList 节点定义是静态内部类。原创 2024-08-13 01:09:29 · 748 阅读 · 0 评论 -
科普文:Java基础系列之【集合ArrayList源码分析】
ArrayList 是常用的存储容器之一, 其底层是用数组实现,可以存储任意类型的数据ArrayList是线程不安全的。非常适用与对元素的查找,效率非常高。ArrayList集合是Collection和List接口的实现类。底层的数据结构是数组。数据结构特点 :增删慢,查询快。线程不安全的集合!许多程序员开发的时候,使用集合基本上无脑选取ArrayList!不建议这种用法。ArrayList的特点:单列集合:对应与Map集合来说【双列集合】有序性:存入的元素和取出的元素是顺序是一样的。原创 2024-08-13 01:05:00 · 935 阅读 · 0 评论 -
科普文:Java基础系列之【并发编程五重排序、 happens-before】
如果一个操作 happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法(也就是说,JMM允许这种重排序)。规则程序顺序规则。原创 2024-08-13 00:59:08 · 862 阅读 · 0 评论 -
科普文:Java基础系列之【并发编程四原子性、可见性,有序性】
synchronized: 具有原子性,有序性和可见性;volatile:具有有序性和可见性。原子性是指:一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。volatile可以保证可见性和有序性,但不能保证原子性。原创 2024-08-13 00:56:59 · 760 阅读 · 0 评论 -
科普文:Java基础系列之【并发编程三JMM内存模型和 volatile缓存一致性】
这其中有很有意思的问题,如果线程A更新后数据并没有及时写回到主存,而此时线程B读到的是过期的数据,这就出现了“脏读”现象。Java线程内存模型与CPU缓存模型类型,是基于CPU缓存模型来建立的,Java线程内存模型是标准化的,屏蔽了底层不同计算机的区别。作用于工作内存,将计算好的值重新赋值到工作内存中,每当虚拟机遇到一个需要使用这个变量的指令时,将会执行这个动作。作用于工作内存 ,将工作内存数据传送给主内存中,以备随后的write操作使用。,将主内存变量解锁,解锁后其他线程可以锁定该变量,被其他线程锁定。原创 2024-08-13 00:53:16 · 910 阅读 · 0 评论 -
科普文:Java基础系列之【并发编程二java线程基础】
与之对应的就是用户线程,用户线程就可以认为是系统的工作线程,它会完成整个系统的业务操作。InterruptedException 不是运行时异常,也就是说程序必须捕获并且处理它,当线程在sleep() 休眠时,如果被中断,这个异常就会产生。守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,在后台默默地守护一些系统服务,比如垃圾回收线程,JIT线程就可以理解守护线程。,它会一直阻塞当前线程,知道目标线程执行完毕((别的线程得等调用了join的线程执行完)。方法,会抛出异常,被catch捕获。原创 2024-08-13 00:50:45 · 769 阅读 · 0 评论 -
科普文:Java基础系列之【网络编程Api概叙】
TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。原创 2024-08-13 00:08:51 · 838 阅读 · 0 评论 -
科普文:Java基础系列之【Java 流(Stream)、文件(File)和IO 】
File类介绍它是文件和目录路径名的抽象表示文件和目录是可以通过File封装成对象的对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的方法名说明通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例从父路径名字符串和子路径名字符串创建新的 File实例从父抽象路径名和子路径名字符串创建新的 File实例File类的构造方法运行结果。原创 2024-08-13 00:08:19 · 700 阅读 · 0 评论 -
科普文:Java基础系列之【集合框架与数据结构】
在本文中,我们将深入探讨Java集合框架和数据结构的核心概念、算法原理、具体操作步骤、数学模型公式、代码实例以及未来发展趋势和挑战。早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。集合框架被设计成要满足以下几个目标。原创 2024-08-12 22:45:16 · 832 阅读 · 0 评论 -
科普文:Java基础系列之【Socket网络编程】
Socket(中文:套接字)编程是网络常用的编程,我们通过在网络中创建Socket关键字来实现网络间的通信;要想解释清楚Socket,首先要知道TCP,要想知道TCP,那就得对TCP/IP的体系结构以及每一层的大概工作有所了解,那么我们就先来说说TCP/IP的分层。链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;原创 2024-08-12 22:25:06 · 1009 阅读 · 0 评论 -
科普文:Java基础系列之【内部类InnerClass】
在一个类的内部定义另外一个类,那么另外一个类则称作为内部类。内部类的class文件名: 外部类$内部类.class成员内部类的访问方式:(普通的访问方法)方式一:在外部类提供一个方法创建内部类的对象进行访问。方式二:在其他类中直接创建内部的对象进行访问。格式:外部类.内部类 变量名 = new 外部类().new 内部类();疑问: 什么时候使用内部类呢?当我们分析事物时,发现事物的内部还有具体的事物,这时则应该定义内部类了。比如人体是一个类,人体有心脏,心脏的功能在直接访问人体的其他内容。原创 2024-08-12 22:03:21 · 892 阅读 · 0 评论 -
科普文:Java基础系列之【互联网基石:TCP/IP四层模型下数据帧是如何传输的】
概叙计算机网络中一个关键步骤在于通信路径上不同节点对于流经本节点的数据包转发,常见的交换设备主要是交换机(第二层、三层)和路由器(第三层),在实际运行时,它们各自维护一些表结构帮助完成数据包的正确寻址与转发。本文详细介绍了三张至关重要的表:转发表、ARP表与路由表的在网络数据包转发功能中发挥的作用,以及它们协同工作的原理,顺便也会接着之前的文章继续谈谈交换机和路由器的一些事儿。同时解答:TCP/IP四层模型下数据帧是如何传输的?原创 2024-08-12 21:50:12 · 791 阅读 · 0 评论 -
科普文:Java基础系列之【互联网基石:TCP/IP四层模型各层协议介绍】
一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。原创 2024-08-12 21:29:15 · 556 阅读 · 0 评论 -
科普文:Java基础系列之【互联网基石:TCP/IP四层模型】
IPv6目前渐渐流行起来,1995 年 12 月,IETF 发布了 RFC 1883,即IPv6规范,它一共有 128 位地址,这个数目简直就是太庞大了,2^128个,IPv4是2^32个,这个已经是43亿了,2^128个什么概念,不是有句笑话形容IPv6的地址数目的嘛,说给地球上每一粒沙子都分配一个IPv6的地址都分配不完,可想而知IPv6提供的地址数有多大。比如在有线环境下,物理层会将数据帧转换为电信号,在通信的另一方,将电信号转换回数据帧,从数据包中删除标头,然后将数据包重新组合成完整的数据。原创 2024-08-12 21:06:40 · 856 阅读 · 0 评论 -
科普文:Java基础系列之【以太网和以太网交换机】
以太网(Ethernet)指的是由 Xerox公司创建并由Xerox、Intel和 DEC公司联合开发的基带局域网规范,通用的以太网标准于1980年9月30日出台,是当今现有局域网采用的最通用的通信协议标准(是局域网的一种)。以太网是一种计算机局域网技术。以太网有两类:第一类是经典以太网,第二类是。原创 2024-08-12 20:24:29 · 767 阅读 · 0 评论 -
科普文:Java基础系列之【你必须知道的框架基础-计算机网络】
框架基础构件:反射、代理、序列化/反序列化、网络通信。前面介绍了反射、代理、序列化/反序列化,我们继续讲解网络通信。为了方便阅读,增加了大量的配图,考虑到 177 个网络名词加上 123 张图,文章的篇幅就很长了,有必要分类整理下,于是按照网络分层结构,加上分层的扩展内容,把所有名词分成了 15 个小类,方便查阅。原创 2024-08-12 19:26:48 · 837 阅读 · 0 评论 -
科普文:Java基础系列之【你必须知道的框架基础-序列化/反序列化】
(1)Java序列化就是指把Java对象转换为字节序列的过程Java反序列化就是指把字节序列恢复为Java对象的过程。(2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)原创 2024-08-12 18:27:40 · 892 阅读 · 0 评论 -
科普文:Java基础系列之【无侵入的监控利器MyPerf4J 】
随着所在公司的发展,应用服务的规模不断扩大,原有的垂直应用架构已无法满足产品的发展,几十个工程师在一个项目里并行开发不同的功能,开发效率不断降低。于是公司开始全面推进服务化进程,把团队内的大部分工程师主要精力全部都集中到服务化中。服务化可以让每个工程师仅在自己负责的子项目中进行开发,提高了开发的效率,但是服务化同时也带来了其他问题:无法知道每个服务的运行情况,例如,某一台服务它目前的 QPS 是多少?它的平均延迟是多少,99% 的延迟是多少,99.9% 的延迟又是多少?原创 2024-08-12 18:00:23 · 912 阅读 · 0 评论 -
科普文:Java基础系列之【你必须知道的框架基础-代理详解】
1.代理模式:为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象…这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能2.被代理对象可以使远程对象、创建开销大的对象或需要安全控制的对象3.代理模式有不同的形式,主要有三种静态代理、动态代理(JDK代理、接口代理)、和cglib代理(可以在内存中动态的创建对象,而不需要实现接口,它是属于动态代理的范畴)代理模式是一种比较好理解的设计模式。简单来说就是。原创 2024-08-12 13:24:03 · 820 阅读 · 0 评论 -
科普文:Java基础系列之【你必须知道的框架基础-反射/代理】
反射是基础,通过反射获取对象及其属性和操作;代理则可以将反射出来的类包装成目标类,然后构建一个代理类,通过代理类来操控目标类。Java基础系列之【Java动态代理的应用场景和基本原理 】-CSDN博客科普文:Java基础系列之【字节码增强技术探索】-CSDN博客科普文:Java基础系列之【字节码应用案例Fastjson原理和实操说明】-CSDN博客科普文:Java基础系列之【JVM 字节码操作 ASM 框架概叙】-CSDN博客科普文:Java基础系列之【java动态代理基本原理及proxy源码分析五】原创 2024-08-12 11:25:53 · 1164 阅读 · 0 评论 -
科普文:Java基础系列之【java动态代理基本原理及proxy源码分析五】
本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章。* 获取当前代理类,名字是methodFieldName,类型是Method的对象(之前在写入静态池的时候,用的也是methodFieldName)是不是有一种恍然大悟的感觉,此时再回头去看之前分析的方法字节码,就能更好地理解其含义了,以及和我们自己定义的类的字节码有区别的原因了。当然,这只是我们所设想的最基本的一种代理形式。原创 2024-08-12 01:11:18 · 668 阅读 · 0 评论 -
科普文:Java基础系列之【java动态代理基本原理及proxy源码分析四】
注意,这里的方法是通过this.cp.getMethodRef方法得到的,也就是说,这里写入的最终数据,其实是一个符合该方法描述的常量池中的一个有效索引(这部分知识可以参看之前的3篇文章)本文中我们初步了解了方法执行体Code的结构,jvm指令的基本概念,那么在下一篇文章中,我们将会继续探究Proxy的最核心的部分,代理方法的Code部分的结构及其实际实现。:调用静态方法,方法在Constant Pool中索引为2,表示Test.calc方法(这里特别注意,调用的方法目标必须是常量池中的一个有效索引)原创 2024-08-12 01:10:56 · 893 阅读 · 0 评论 -
科普文:Java基础系列之【java动态代理基本原理及proxy源码分析三】
和field_info不同,除了基础的access_flags、name_index、descriptor_index外,MethodInfo的构造函数还写入了2个额外的常量池对象:Code和Exceptions,表示2种attributes。因为方法的结构体其实包含两个大部分,第一部分是和field_info一样的基础属性,第二部分是方法的执行体,所以后面会单独有文章介绍方法的执行体是怎么写入的,这里我们先关注方法的基本结构。//常量池中的一个有效索引,必须是Utf8类型(表示方法或字段的名字)原创 2024-08-12 01:10:09 · 307 阅读 · 0 评论