是在编译时还是运行时检查访问?

时间:2012-12-29 00:18:50

标签: java oop

  

可能重复:
  JVM/Java, are method accessibility rules enforced at runtime?

当使用同时具有公共和私有字段和成员的类时,是否在编译时或运行时检查了访问冲突的代码(例如,尝试从外部类访问私有字段)?或两者兼而有之?

3 个答案:

答案 0 :(得分:4)

两者。如果您尝试编译试图访问不可访问的对象或方法的代码,您将得到编译时错误:

field has private access in package.Class

此外,当您的类尝试在运行时访问某个字段时,JVM会检查访问权限:

Exception in thread "main" java.lang.IllegalAccessError: tried to access field package.Class.field from class YourClass

答案 1 :(得分:3)

在编译期间检查。我尝试了以下两个类:

class A { 
    private int i;
}

class B { 
    private void test() {
        A a = new A();
        a.i = 5;
    }   
}

当我尝试编译B.java时,会发生以下错误:

B.java:4: i has private access in A
        a.i = 5;
         ^
1 error

但是,请记住,这个简单的示例仅适用于基本情况。当考虑反射时,该行为可能改变,即,仅在运行时确定变量的名称。在这种情况下,无法在编译时检查访问修饰符,并且必须将检查推迟到运行时。

答案 2 :(得分:2)

在这两种情况下。在编译时很容易看到。但是在运行时测试并不困难。创建2个类

public class Test1 {
    public static void main(String[] args) throws Exception {
        Test2.hello();
    }
}

public class Test2 {
    static void hello() {
        System.out.println("hello");
    }
}

编译并运行java Test1,它运行正常

现在将Test2更改为

priivate static void hello() {
    System.out.println("hello");
}

并单独编译,以便Test1.class保持不变。运行java Test1。你会得到

Exception in thread "main" java.lang.IllegalAccessError: tried to access method Test2.hello()V from class Test1
    at Test1.main(Test1.java:5)