【问题标题】:How can I change a specific variable in Java?如何更改 Java 中的特定变量?
【发布时间】:2014-05-20 21:50:21
【问题描述】:

我有以下代码:

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

参考下图(粗略绘制):

如您所见,Object 1 和 Object 2 都指向同一个内存位置。

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

需要考虑的其他信息:

  1. 我无权访问Example 的创建或任何代码。
  2. 我确实可以访问Example 的实例。
  3. 我无权访问 originalExample 内的创建。
  4. 我无法访问许多使用original 的方法。
  5. changePointer(Object param) 可能不是必需的。如果可以通过其他方式访问和更改original,那将产生相同的效果。

注意:我理解 pass by referencepass by value 的概念。我知道 Java 是 pass by value,这不是我要问的。我在问有没有什么办法,知道Java是pass by value,以上是可能的。

【问题讨论】:

  • 指向新类型的对象还是同类型的对象?听起来您想将 Object 1 转换为 Object 2
  • 没有。变量original 是方法exampleMethod 的本地变量,不能从该方法外部引用。
  • 回答您的注意事项:否。
  • @Brendan 我的意思是对象 1 和 2 或相同类型的对象。类型无关紧要,但它们是相同的类型。我将对这个问题进行一些澄清。
  • @HotLicks 好吧,这就是我害怕的。看来我运气不好。

标签: java pointers object reference


【解决方案1】:

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(..)

【讨论】:

  • 这样,actualOriginal 不会被修改为指向新对象。
  • @Haozhun 是的,这就是我要说的。解决方法是使用数组original
  • 这很有用,但问题是我无法控制actualOriginal 的使用方式。因为actualOriginal 被我无权访问的代码使用,所以上述解决方案在我的特定情况下不起作用。我想我将不得不接受,由于 Java 的性质,我所问的根本不可能。
  • @user3144349 你似乎不走运:(。
【解决方案2】:

你可以反思一下,但它会很脆弱,具体取决于代码更改的程度。

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
}

【讨论】:

    猜你喜欢
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2023-04-08
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多