簡體   English   中英

在同一個包中訪問私有內部類

[英]Accessing private inner class in the same package

我有兩個編譯單元:

public class OuterClass{

    private static class InnerClass{

        public String test(){
            return "testing123";
        }
    }

    public static void main( String[] args ){
        new CallingClass().test( new InnerClass() );
    }
}


public class CallingClass{

    public void test( Object o ){
        try{
            Method m = o.getClass().getMethod( "test" );
            Object response = m.invoke( o );
            System.out.println( "response: " + response );
        }
        catch( Exception e ){
            e.printStackTrace();
        }
    }
}

如果它們在同一個包中,一切正常並且打印出“response:testing123”。 如果它們位於單獨的包中,則拋出IllegalAccessException。

據我所知,拋出異常是因為CallingClass無法調用私有的InnerClass方法。 但我不明白為什么在同一個包中允許它? InnerClass不受包保護。 即使它在同一個包中,也不應在OuterClass外看到Private。 我理解錯了嗎?

內部類的javap簽名:

class modifiers.OuterClass$InnerClass extends java.lang.Object{
    final modifiers.OuterClass this$0;
    public java.lang.String test();
}

說到字節碼(即運行時),就沒有私有類這樣的東西。 這是編譯器維護的虛構。 對於反射API,有一個包可訪問類型,帶有公共成員方法。

實際訪問修飾符在JVM規范中定義:

Flag Name      Value   Interpretation
ACC_PUBLIC     0x0001  Declared public; may be accessed from outside its package.
ACC_FINAL      0x0010  Declared final; no subclasses allowed.
ACC_SUPER      0x0020  Treat superclass methods specially when invoked by the
                       invokespecial instruction.
ACC_INTERFACE  0x0200  Is an interface, not a class.
ACC_ABSTRACT   0x0400  Declared abstract; may not be instantiated. 

私有訪問修飾符比包一強(即在Java中根本沒有訪問修飾符)。 因此,類的私有元素 - 無論是字段,方法還是內部類 - 只能在該類中訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM