2015-11-26 37 views
1

我已經注意到Java和Android中包範圍的奇怪行爲。Java和Android中的包範圍訪問

  1. 我已經在我的項目
  2. 下一頁創建包「的java.util.concurrent。」我補充類TestClass的在剛剛創建包

    package java.util.concurrent; 
    
    public class TestClass { 
    
        public void testMethod() { 
    
         ArrayBlockingQueue s = new ArrayBlockingQueue(1); 
         // I can use items field. 
         Object[] items = s.items; 
    
        } 
    
    } 
    
  3. ArrayBlockingQueue類的領域的項目有最後包範圍

    public class ArrayBlockingQueue<E> extends AbstractQueue<E> 
         implements BlockingQueue<E>, java.io.Serializable { 
    
    
        ....     
    
        /** The queued items */ 
        final Object[] items; 
    
        .... 
    
    } 
    

接下來,當我試圖用通常的Java Project(java 1.8.6x)編譯TestClass時。我獲得成功,這是合乎邏輯的。

但同一類中的Android項目回報編譯時錯誤。原因是「我的班級無法訪問此字段」。

你有什麼想法嗎?

UPDATE

屏幕波紋管顯示的Android版本和Queue類的代碼

enter image description here

+0

從哪裏可以訪問它?兩種情況下都是一樣的套餐? –

+0

什麼版本的android? –

+0

我添加了屏幕。版本的API是23 – kemenov

回答

1

這似乎是的ArrayBlockingQueue Android版本是不一樣的Java版本。在Android中,itemsactually private。這對於爲什麼超出範圍是有意義的。你可以解決這個問題,反射你可以gain access to private variables(不知道約最後私人)

+0

凱文的權利。例如:openjdk將項目定義爲:'private final E [] items;' – Shloim

+0

哇,不能相信我犯了這個錯誤(即它的openjdk而不是android源碼)。感謝您輸入正確的 – Kevin

+0

我已添加屏幕,其中顯示Android版本和包含作用域的項目字段。 – kemenov