我有以下代码:
Example
是我无法访问的类,并且Object original
作为实例变量。
public class Example {
private Object original;
public Object getOriginal() {
return original;
{
}
changePointer(Object param)
是一个可以在任意静态助手类(IE,Math)中的方法。
public static void changePointer(Object param) {
//Change the pointer of original
}
我希望changePointer(Object o)
能够更改original
的指针。
转换必须在changePointer(Object param)
中完成。 IE,以下对我没用:
public static void exampleMethod() {
Object original = new Object();
original = changePointer(original);
}
public static Object changePointer(Object param) {
return new Object();
}
参考下面(粗略绘制的)图表:
如您所见,对象1和对象2都指向相同的内存位置。
我的问题:是否可以仅使用变量Object 2来更改对象1的指针?
需要考虑的其他信息:
Example
的代码或任何代码。Example
。original
内创建Example
。original
。changePointer(Object param)
可能没有必要。如果有可能以某种其他方式获得访问权限并更改original
,则会产生相同的效果。 注意:我理解pass by reference
vs pass by value
的概念。我知道Java是pass by value
,而这并不是我所要求的。我知道Java是pass by value
是否有任何办法可以实现上述目标。
答案 0 :(得分:4)
Since Java is pass-by-value always,你所要求的不是直接可能的。
通常的解决方法是使用大小为1的目标类型数组。您传递数组并将其中的引用修改为新数组。
Object actualOriginal = new Object();
Object original[] = new Object[] {actualOriginal};
...
public static void changePointer(Object[] param) {
param[0] = new Object();
//Change the pointer of original
}
...
// original[0] now has a reference to whatever you set in changePointer(..)
答案 1 :(得分:1)
你可以反思地做,但根据代码的变化,它会很脆弱。
public static Example changeOriginalPointer(Example param, Object newOriginal)
{
Field originalField=clazz.getDeclaredField("original");
originalField.setAccessible(true);
originalField.set(param, newOriginal);
originalField.setAccessible(false); //this is probably not necessary
}