
Java
文章平均质量分 78
超频化石鱼
这个作者很懒,什么都没留下…
展开
-
SpringBoot中企业微信的API调用
企业微信官方提供的均为API接口,没有提供集成SDK。因此无需引入Maven依赖,直接以Https方式请求即可。有些第三方提供了集成的Java SDK,可根据需求自行选用。本文采用直接调用官方API的方式。原创 2023-11-20 15:08:36 · 1937 阅读 · 0 评论 -
MessageFormat:格式化字符串
实际需要对[]内的内容进行替换。如果调用,那需要执行多次。而使用。原创 2023-11-15 17:42:30 · 1309 阅读 · 0 评论 -
Feign原理及其使用
Feign的原理介绍及使用流程原创 2022-11-24 16:35:54 · 1738 阅读 · 0 评论 -
Java链式调用的继承:泛型
常规链式调用对于链式调用,只需要在某些操作方法中返回this即可:class A { protected String name; public A setName(String name) { this.name = name; return this; } public String getName() { return name; }}如上,使用时:String name = new A().set原创 2021-01-07 09:39:43 · 1440 阅读 · 0 评论 -
Spring Boot中使用Druid替换MyBatis数据库连接池
介绍Druid是阿里使用的数据库连接池,被阿里推崇为Java最好的数据库连接池。不仅可以承担数据库的连接访问工作,还可以提供强大的监控和扩展功能。集成到Spring Bootpom.xml添加依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artif...原创 2020-01-14 14:15:20 · 878 阅读 · 0 评论 -
在java文件中动态调用groovy文件
说明GroovyClassLoader是Java的groovy库提供的类。该类可以动态将Groovy文件解析为class文件,从而可以调用其中的方法。由于Groovy是脚本文件,Java是无法得知其类定义的,因此只能动态得到一个Class文件,而无法得到具体的类定义。如下面的例子,直接在Java代码中使用GMath类是非法的,因为Java并不知道GMath类的定义。故而,只能通过Class....原创 2020-01-03 09:32:30 · 1310 阅读 · 1 评论 -
修改java的class文件:ASM使用
ASM基础ASM是一个Java字节码操作框架,可用于class文件的修改。其原理是将class文件载入,然后构建成一棵树。然后根据用户自定义的修改类对该树进行加工,加工完成后即可得到修改后的class文件。故而ASM中使用了visitor模式:class文件的结构是固定的,根据其构造出的树作为被访问者,则其节点也是固定的。只需要对每个节点定义一个访问者即可进行指定的修改。由于修改class...原创 2019-10-30 11:34:49 · 3408 阅读 · 0 评论 -
修改jar中的class:杀戮尖塔修改教程
缘起作为一只程序猿,游戏自然是标配。自从入了杀戮尖塔的坑,几年来陆陆续续玩了几百小时。然而steam上的成就至今没刷完,发牌员和各路小怪次次都在针对我。在第nn{n^n}nn次死于通往进阶20的三层小怪之手后,我感受到了出离的愤怒。于是我决定,用技术怼它。思路杀戮尖塔是用java开发,其主程序是一个.jar文件。现在要修改铁甲战士的基础卡:打击。打击的基础伤害是6,目标是将其修改为60...原创 2019-10-08 14:02:43 · 8914 阅读 · 6 评论 -
修改jar包中的class文件
需求及准备需求现在有一个.jar文件,要修改其中某个文件的代码。准备确保JRE已安装且环境变量已配置。安装Java Decompiler。官方地址为:http://java-decompiler.github.io/选择其中的JD-GUI进行下载。安装winrar。提取class内容并修改打开JD-GUI,将.jar拖进来。JD-GUI会将jar包反编译为j...原创 2019-10-08 13:36:01 · 4270 阅读 · 1 评论 -
Java函数式编程:Lambda表达式和函数式接口
Lambda表达式Java的Lambda表达式形式为:(params) -&amp;gt; { statements };其中:若params只有1个,可以省略():param -&amp;gt; { statements };若params为0个,用()表示无参数:() -&amp;gt; { statements };若代码为一行,则可省略{},无论该行代码是否为表达式:(params) -&amp;gt;原创 2019-01-11 10:18:54 · 281 阅读 · 0 评论 -
java模板引擎:velocity
在java中,同类型的模块代码结构往往是相似的。以Spring为例,一个工程都会包含controller,service,dao,modal等类型的代码。而dao用于数据库的访问,不同的表所对应的dao类都会有get,set,select,delete等操作,若手动编写dao,则这些dao有很多代码是类似的。于是希望自动生成这部分代码。一个非常直观的思路就是:写一个String模板,然后使用字符...原创 2018-12-05 17:06:45 · 2548 阅读 · 2 评论 -
对象的访问定位
Java栈的本地变量表中,存储着一个reference数据,其中存储着一个引用。reference就是用来操作堆上的具体对象的。而一个引用如何定位和访问堆中对象的具体位置,有两种方式:句柄和直接指针。1. 句柄Java堆中划分一块内存作为句柄池。reference存储了对象的句柄地址。而句柄中就包含了对象实例数据等具体的地址信息。当对象被移动时,只会修改句柄中的实例数据指针。referenc...原创 2018-02-26 08:45:56 · 253 阅读 · 0 评论 -
常量池垃圾回收:判断类的存活
方法区中的常量池也需要进行垃圾回收。主要回收对象是废弃的常量和无用的类。其中,判断类的存活需要同时满足以下3个条件:1. 该类所有的实例已经被回收,即Java堆中已经不存在任何该类的实例。2. 加载该类的ClassLoader已经被回收。3. 该类对应的java.lang.Class对象没有在任何地方被引用,即无法在任何地方通过反射访问该类的方法。同时满足这3个条件的类,就是可回...原创 2018-02-27 15:41:34 · 1049 阅读 · 0 评论 -
垃圾回收算法
1. 标记-清除算法首先标记出所有需要回收的对象,标记完成后统一回收所有标记对象。该算法是最基础的回收算法。主要问题是:标记和清除的效率不高;标记清除后会产生大量不连续内存碎片,以至于程序要分配大内存时无法找到足够的连续内存,从而不得不提前触发下一次垃圾清理。2. 复制算法将内存划分为容量相等的两块。每次只使用一块。当内存1用完时,就把所有活着的对象顺序复制到内存2上,然后对内存1进行...原创 2018-02-27 15:42:23 · 184 阅读 · 0 评论 -
垃圾回收时的安全点与安全区
垃圾回收时,首先要枚举所有GC Roots节点。然而枚举GC Roots节点是需要停顿执行系统的。执行系统的停顿不可以过久,否则会影响整个系统的执行。为了能快速计算出对象内什么偏移量上是什么类型的数据,从而迅速完成枚举,HotSpot使用OopMap。OopMap是个Map,记录了所有必要信息的具体地址。 然而,OopMap是需要空间的。若每一条指令都创建一个对应的OopMa...原创 2018-02-27 15:42:57 · 541 阅读 · 0 评论 -
垃圾收集器
针对于具体的情况,JVM使用不同的垃圾收集器。按照不同分代,HotSpot使用了七种垃圾收集器:① 新生代:Serial,ParNew,Parallel Scavenge② 老年代:CMS,Serial Old(MSC),Parallel Old③ 通用:G1 如图。连线表示可搭配使用。1. Serial收集器Serial...原创 2018-02-27 15:44:02 · 172 阅读 · 0 评论 -
程序计数器,虚拟机栈和本地方法栈
Java的内存区中,为线程私有的有三部分:程序计数器,虚拟机栈,本地方法栈。1. Java虚拟机的程序计数器用于指定程序所执行字节码的行号。2. Java的多线程是用时间片轮转的方式实现的。每个线程都有自己的程序计数器,称之为线程私有,用于轮转到自己时从上次执行位置继续执行。3. 每个线程执行时,都会创建一个栈,称为虚拟机栈。而每个方法在执行时,需要存储变量表,操作数,动态链接和...原创 2018-02-26 08:42:46 · 1236 阅读 · 0 评论 -
Java堆,方法区,直接内存
Java的内存区中,为线程共有的有三部分:Java堆,方法区,直接内存。其中方法区中包含运行时常量池。直接内存并不属于Java的常规内存区。1. Java堆是被所有线程共享的一块内存,在启动虚拟机时创建。通常,所有的对象实例及数组都要在堆上分配。但并不绝对。2. Java堆可扩展。其内存在物理上可以不连续。当Java堆无法再扩展时,将抛出内存不足异常。3. Java的垃圾收集器主...原创 2018-02-26 08:44:01 · 424 阅读 · 0 评论 -
Java对象创建过程
1. 用户new一个对象。2. JVM检查常量池,看是否可定位到一个类(所对应的符号引用),并检查该类是否已经加载,解析和初始化。若没有,则执行类加载过程。3. 类加载检查通过,JVM为新对象分配内存。由于类已经加载完成,所以内存大小是可以确定的。分配过程就是从Java堆中划分一块内存出来。JVM维护了一个空闲内存列表,记录了所有可用的内存块。分配时划分一块足够大的内存出来。这称...原创 2018-02-26 08:44:34 · 268 阅读 · 0 评论 -
JVM对象内存布局
HotSpot虚拟机中,对象在内存中的存储布局分3部分:对象头,实例数据,对齐填充。一. 对象头对象头包含两部分信息:对象的运行时数据和类型指针。1. 对象的运行时数据对象的运行时数据非常多,主要有哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等。① 哈希码:对象的标识。② GC分代年龄:GC即Java的垃圾回收机制。Java堆分两部分:新生代堆和老...原创 2018-02-26 08:45:23 · 343 阅读 · 0 评论 -
判断对象存活:可达性分析算法
判断对象存活,常用的方式是引用计数器:每当对象被一个地方引用,计数器便+1;当引用失效时,计数器-1。当对象的计数器为0时,该对象便是一个不被使用的对象,即“死亡”。引用计数器实现简单,效率高。然而难以解决对象之间相互循环引用的问题(两个失效对象相互保存了对方的指针)。故JVM判定对象是否存活,并没有使用引用计数器,而是使用可达性分析算法。可达性分析算法即:有一系列“GCRoots”起点,从这些点...原创 2018-02-27 15:40:53 · 1241 阅读 · 0 评论