我有一个包中的变量,我无法修改包或该类,我需要访问它是否有任何方法可以执行此操作。我无法修改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。反正有吗?
答案 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);