如何在类I中访问受包保护的变量无法修改

时间:2017-09-27 00:10:04

标签: java

我有一个包中的变量,我无法修改包或该类,我需要访问它是否有任何方法可以执行此操作。我无法修改com.archi.hello或其内容

例如:

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,是的,我尝试扩展obj。反正有吗?

1 个答案:

答案 0 :(得分:0)

有两种可能的情况可以获得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;
    } 
}

只需执行此操作即可获得j的价值:

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

案例2:private int j具有私有访问修饰符,因此它与外部完全不可见。在Java的encapsulation priciple中,它不允许以官方方式访问或修改j。但是,您可以使用一些技巧来获得值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);