如何在Java中更改特定变量?

时间:2014-05-20 21:50:22

标签: java pointers object reference

我有以下代码:

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();
}

参考下面(粗略绘制的)图表:

enter image description here

如您所见,对象1和对象2都指向相同的内存位置。

我的问题:是否可以仅使用变量Object 2来更改对象1的指针?

需要考虑的其他信息:

  1. 我无法访问属于Example的代码或任何代码。
  2. 我可以访问Example
  3. 的实例
  4. 我无法在original内创建Example
  5. 我无法使用许多使用original
  6. 的方法
  7. changePointer(Object param)可能没有必要。如果有可能以某种其他方式获得访问权限并更改original,则会产生相同的效果。
  8. 注意:我理解pass by reference vs pass by value的概念。我知道Java是pass by value,而这并不是我所要求的。我知道Java是pass by value是否有任何办法可以实现上述目标。

2 个答案:

答案 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
}