How to Read Java Class Version

It is easy enough to read the class file signature and get these values without a 3rd party API. All you need to do is read the first 8 bytes. ClassFile { u4 magic; u2 minor_version; u2 major_version; e.g.: Read a file which is version 61.0 (Java 17) hexdump -C Identification.class 00000000 ca fe ba be 00 00 00 3d 00 20 0a 00 02 00 03 07 |.......=. ......| 00000010 00 04 0c 00 05 00 06 01 00 10 6a 61 76 61 2f 6c |....

July 11, 2022 · Zi WANG

java.util.List 的 remove(int) 与 remove(Object)

最近看到 V2EX 上一个帖子《关于 Java foreach 循环删除多个元素的有趣问题(不是抛异常哦)》,我根据代码预测的执行结果与实际楼主贴出的并不相同。看了评论,才发现自己忽略了一点,觉得有点意思,因此记录一下。

July 8, 2018 · Zi WANG

译|if(a - b < 0) 与 if(a < b) 的区别

一个针对此问题 Stack Overflow 上的回答。

May 8, 2018 · Zi WANG

【Java 核心笔记】04.07. 反射

反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵 Java 代码的程序。 能够分析类能力的程序称为反射(reflective),其可以: 在运行中分析类 在运行中查看对象 编写泛型数组代码 调用任意方法 java.lang.Class 类用于描述 JVM 中使用的类。 不要过多地使用反射,其不适合编写应用程序。反射是很脆弱的,编译器很难帮助人们发现程序中的错误,因此很有可能会导致运行时出现异常。 在运行中分析类 获取Class对象的三种方式(JVM为每个类型管理一个 Class 对象): // 1. 通过实例对象获取 Random random = new Random(); Class cl = random.getClass(); System.out.println(cl.getName()); // 输出为 java.util.Random // 2. 通过静态方法 forName 获得类名对应的 Class 对象 Class cl = Class.forName("java.util.Random"); // 3. 通过`类.class`获取(例如cl2,基本类型也可以) Class cl1 = Random.class; Class cl2 = int.class; Class cl3 = Double[].class; // 历史原因,getName 方法有时会返回一个奇怪的名字 Double[]....

October 14, 2017 · Zi WANG

【Java 核心笔记】04.06. UML

类间关系 依赖(dependence)(uses-a):例如Order对象使用Account对象查看账户的信用状态 聚合(aggregation)(has-a):例如Order对象包含了一些Item对象 继承(inheritance)(is-a) 对应的 UML 符号 有些方法学家不喜欢聚合这个概念,而更加喜欢「关联(association)」这个术语。但「has-a」更加形象,同时「关联」的 UML 符号不易区分。 以下是一个UML类图的示例:

October 14, 2017 · Zi WANG

【Java 核心笔记】04.05. 内部类、lambda

在类的内部还可以定义另一个类。如果在类 Outter 的内部再定义一个类 Inner ,此时类 Inner 就称为内部类,而类 Outter 则称为外部类。 内部类可声明为 public 或 private。当内部类声明为 public 或 private 时,对其访问的限制与成员变量和成员方法完全相同。 class Outer { // 定义外部类 private String info = "hello world"; // 定义外部类的私有属性 class Inner { // 定义内部类 public void print(){ // 定义内部类的方法 System.out.println(info); // 直接访问外部类的私有属性 } } public void fun() { // 定义外部类的方法 new Inner().print(); // 通过内部类的实例化对象调用方法 } } public class InnerClassDemo01 { public static void main(String args[]){ new Outer()....

October 14, 2017 · Zi WANG

【Java 核心笔记】04.04. 代码块

代码块就是使用 {} 括起来的一段代码,根据位置不同,可分为四类: 普通代码块 构造代码块 静态代码块 同步代码块 普通代码块 直接定义在方法中的代码块称为普通代码块。 public class Demo { public static void main(String args[]) { { // 普通代码块 int x = 30; // 属于局部变量 System.out.println("普通代码块 --> x = " + x); } int x = 100; // 与局部变量名称相同 System.out.println("代码块之外 --> x = " + x); } } // 输出 // 普通代码块 --> x = 30 // 代码块之外 --> x = 100 构造代码块 直接在类中定义的代码块,称为构造块。...

October 14, 2017 · Zi WANG

【Java 核心笔记】04.03. 匿名对象与字符串缓冲池

匿名对象 匿名对象:只在堆内存中开辟空间,不存在栈内存的引用。 由于匿名对象没有对应的栈内存引用所指向,所以使用一次之后,就等待被垃圾回收了。 例:一个单独的字符串就是一个 String 的匿名对象。System.out.println("Hi"); 字符串缓冲池 public class Test { public static void main(String[] args) { String str = "hello" ; System.out.println("hello".equals(str)) ; // true System.out.println("hello" == str); // true // String 池:Java为了优化字符串操作 提供了一个缓冲池; // str 指向字符串 "hello", 第二句中字符串 "hello" ,为同一指向。 // 这是因为字符串在常量池中已经存在,第二句中字符串 "hello" 就不再开辟新空间。 // 所以不管是 equals 比较内容, == 比较内存地址都为 true。 // 但请不要使用这种方式比较字符串,不稳键。 } } 下面的代码验证了我去「XXXX」面试时真的是乱吹🙈: /* * 当时我以为 JVM 的缓冲池可以实现“变量(a)连接字符串("b")可以与"ab"使用同一个堆内存” * 但是事实是并不可行 */ public class StringTest{ public static void main(String [] args){ String ab="ab"; String a="a"; // 「变量」与「变量连接字符串(匿名对象)」比较 System....

October 7, 2017 · Zi WANG