1.在idea中新建test.java文件,文件内容如下:
public class test {
private int m;
public int inc() {
return m + 1;
}
public static void main(String[] args) {
test t = new test();
t.m = 1;
System.out.println(t.inc());
}
}
2.执行javac命令,编译出test.class文件。
javac test.java
3.网上下载winhex软件,打开软件,并将test.class文件导入,如图所示:
image.png
4.执行javap命令 找到常量池最后一个位置,即access_flags的开始位置。
位置参考如下图所示:
image.png
javap -v test.class
执行结果,如图所示:
image.png
image.png
在常量池最后一行显示的是(I)V ,所以,在winhex工具中找到(I)V的位置,即找到了access_flags的位置,如下图所示:
image.png
可见 test.class文件中的access_flags的值是0x0021 即 0x0001 | 0x0020
对照jvm访问标志表,可查看。如下图所示。
image.png
5.将test.class文件中的acc_public项设置为空,即test类的public修饰符去掉,也就是access_flags的值变为0x0020,并在另一个目录另存为test.class 。如下图所示:
image.png
6.最后在新目录执行命令,test.class仍可正常运行。此功能验证成功。
javap -v test.class
image.png
此处,发现access_flags的值已经修改成功。
7.最后在新目录执行命令,test.class仍可正常运行。此功能验证成功。
java test