【发布时间】:2015-04-08 20:17:24
【问题描述】:
考虑以下场景:
package packA;
public class A
{
private static int i = 0;
}
package packB;
public class B
{
public static void main(String[] args)
{
int i = A.i + 1;
}
}
因为A.i 是private,所以无法从类B 访问它,这样做会导致编译器错误。
但是,如果我像这样检测 B 类
public class B
{
public static void main(String[] args)
{
// getstatic packA/A.i : I
// iconst_1
// iadd
// istore_1
}
}
调用main方法,JVM验证器会检查访问A.i是否有效?同样,如果A.i 被声明为final,它是否会将以下字节码视为有效?
public class B
{
public static void main(String[] args)
{
// iconst_2
// putstatic packA/A.i : I
}
}
我对此感到疑惑,因为验证程序需要加载类来检查字段的访问标志。此外,如果它不验证它们,则可能会检测恶意字节码来更改字段的值或提供允许访问字段而无需反射的“黑客方法”。
【问题讨论】:
-
到目前为止,JVMS 已经完全涵盖了您提出的许多问题。最后不是学习规范的好时机吗? 5.4.3. Resolution 清楚地回答了您的问题:在字段解析期间检查了访问标志;是的,如果需要,在此过程中会加载引用的类。
-
我在验证评论中的一些评论后更新了我的答案。事实证明,我的原始答案和评论都不正确。
标签: java jvm javac bytecode-manipulation