gpt4 book ai didi

Java 访问标志验证

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:30 25 4
gpt4 key购买 nike

考虑以下场景:

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.iprivate,所以不可能从类 B 访问它,这样做会导致编译器错误。

但是,如果我像这样检测 B

public class B
{
public static void main(String[] args)
{
// getstatic packA/A.i : I
// iconst_1
// iadd
// istore_1
}
}

然后调用main 方法,JVM validator 会检查访问A.i 是否有效吗?同样,如果 A.i 被声明为 final,它是否会将以下字节码作为有效字节码传递?

public class B
{
public static void main(String[] args)
{
// iconst_2
// putstatic packA/A.i : I
}
}

我对此感到疑惑,因为验证者需要加载类来检查字段的访问标志。此外,如果它不验证它们,则可能会检测恶意字节码以更改字段的值或提供“黑客方法”,从而允许在不进行反射的情况下访问字段。

最佳答案

访问对访问类不可见的字段会导致验证错误。为了应用此验证,JVM 需要加载和链接声明此字段的类。这是正常的验证过程,例如,JVM 还需要加载类以检查方法是否存在。然而,可以延迟应用验证和所需的类加载,即在第一次执行方法之前。

一个异常(exception)是 HotSpot,其中一个类扩展了 MagicAccessorImpl,它是一个内部接口(interface)。验证者跳过此类类的访问级别验证。这是 JVM 内部代码生成所必需的,其中反射代码被优化为字节代码。另一个异常(exception)是通过匿名类加载器加载的类,它继承了另一个类可见性上下文,例如 lambda 类。

对于内部类,javac 将包私有(private)访问器方法插入到声明类中,以便内部类可以访问其外部类的字段。

编辑:我在评论后编辑了我的答案,但现在有时间验证这个和最终字段确实与我的第一个答案略有不同,但也与评论所说的相比:

  1. 对于构造函数, validator 仅验证最​​终字段分配是从构造函数内部执行的,即名为 <init> 的方法。在字节码级别。因此,下面的字节码是可以的,Java代码是不允许的:

    class Foo {
    final int bar; // is 0
    Foo() { }
    }

    class Foo {
    final int bar; // is 2
    Foo() {
    bar = 1;
    bar = 2;
    }
    }

    class Foo {
    final int bar; // is 2
    Foo() {
    this(null);
    bar = 2;
    }
    Foo(Void v) {
    bar = 1;
    }
    }
  2. 对于静态字段,Java 编译器没有强制执行此类限制,即以下 Java 代码在字节码中是合法的:

    class Foo {
    static final int bar; // is 0
    static { }
    }


    class Foo {
    static final int bar; // is 2
    static {
    bar = 1;
    bar = 2;
    }
    }

    class Foo {
    static final int bar; // is 2
    static {
    bar = 1;
    foobar(2);
    }
    static foobar(int i) {
    bar = i;
    }
    }

    Foo.foobar(3); // bar is 3

关于Java 访问标志验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29524527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com