2017-09-27 68 views
-3

我有一個包中的變量,我既不能修改包或該類,也需要訪問它,是否有任何方法可以執行此操作。我不能修改com.archi.hello或它如何在類I中訪問受封裝保護的變量不能修改

對於實施例的內容:

com.archi.hello:

類OBJ:

public class obj() { 
    int j = 123; 
    int getJ() { 
     return j; 
    } 
} 

com.archi.newpackage :

public class getJo() { 
    int jo; 
    obj obj = new obj(); 
    jo = obj.getJ(); // THIS DOES NOT WORK BECAUSE THE GETTER IS NOT 
    PUBLIC 
} 

我需要將jo設置爲j,而不以任何方式修改com.archi.hello,並且是的, d擴展obj。無論如何要做到這一點?

+2

是'j'本地或外地?它的可見度是什麼?請發佈[mcve]。 – shmosel

+0

沒有足夠的信息來幫助你。你應該提供'visibility scope','getter/setter',class type'Abstract,...' –

+0

它就像在這個例子中一樣 –

回答

0

有2個可能的情況得到的j值:
案例1:因爲在你的榜樣,類obj是公衆和int j默認visibility =>j作爲公衆。 Read this about default access modifier

public class obj() { 
    int j = 123; // not declared modifier => modifier is public because obj class is pulic 
    int getJ() { // this method is private 
     return j; 
    } 
} 

只是做thiss得到的j值:

obj objInstance = new obj(); 
int valueOfJ = objInstance.j; 

案例2:private int j私人訪問修飾符所以它是無形的完全與外界。在Java的encapsulation priciple中,不允許訪問或修改官方的方式。但是,你可以使用一些技巧來獲得價值j

public class obj() { 
    private int j = 123; // declared modifier => modifier is private 
    int getJ() { // this method is private 
     return j; 
    } 
} 

如何獲得j

obj objInstance = new obj(); 
java.lang.reflect.Method method = objInstance.getClass().getDeclaredMethod("getJ"); 
method.setAccessible(true); 
int valueOfJ = (int)method.invoke(objInstance); 
+0

對於案例1:我相當肯定,'j'不公開只是因爲該類是公開的。這些變量是'package-private',這意味着它們可以在包中的其他地方訪問(這對提問者沒有幫助,因爲他指定他不能修改包中的任何內容)。但反射的東西仍然有效。 –

+0

是的,這就是爲什麼我說有2種可能的情況^^! –

+0

我只是說您的評論「//未聲明修飾符=>修飾符是公開的,因爲obj類是公共的」是錯誤的。沒有修飾符是包私有的。 –