2

重複の可能性:
JVM/Java、メソッドのアクセシビリティ規則は実行時に適用されますか?

public と private の両方のフィールドとメンバーを持つクラスを使用する場合、コンパイル時または実行時にコードのアクセス違反 (外部クラスから private フィールドにアクセスしようとするなど) がチェックされますか? または両方?

4

3 に答える 3

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
于 2012-12-29T00:31:36.723 に答える
3

両方の場合において。コンパイル時に簡単に確認できます。しかし、実行時にテストすることも難しくありません。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)
于 2012-12-29T00:44:40.953 に答える
3

コンパイル時にチェックされます。次の2つのクラスを試しました:

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

ただし、この単純な例は基本的なケースでのみ機能することに注意してください。この動作は、リフレクションを考慮すると変更される場合があります。つまり、変数の名前は実行時にのみ決定されます。その場合、コンパイル時にアクセス修飾子をチェックすることはできず、チェックは実行時に延期する必要があります。

于 2012-12-29T00:28:23.703 に答える