【问题标题】:Rewrite/change object to change references without setters重写/更改对象以更改引用而无需设置器
【发布时间】:2019-03-14 17:02:56
【问题描述】:

我无法确定是否可以在不使用类设置器方法的情况下更改所有引用。 我也仅限于 java.util.* 方法。

想象一下这段代码:

public static void main(String[] args) {
    List<Apple> first = new ArrayList<>();
    List<Apple> second = new ArrayList<>();

    Apple someApple = new Apple(5);
    first.add(someApple);
    second.add(someApple);



    Apple changeIt = first.get(0);
    // Is it possible to change / rewrite object changeIt (no class setters available)

}


public static class Apple {
    int size;

    public Apple (int size){
        this.size = size;
    }

    public int getSize() {
        return size;
    }

}

目标是更改List&lt;Apple&gt; second 中的相同对象。我不能直接访问List&lt;Apple&gt; second 也不能直接访问类设置器。

编辑> 也许这段代码更好地解释了这种情况:

List<Obj> doSomething = cantTouch.getUseThis();

public class Obj {
    var SomeVariables;
    public Obj(){}
}

public class cantTouch {
    private static List<Obj> tryToModify = new ArrayList<>();
    public static List<Obj> useThis = new ArrayList<>();

    public static void createObj() {
        Obj someObj = new Obj();
        tryToModify.add(someObj);
        useThis.add(someObj);
    }

    public static List<Obj> getUseThis(){
        return useThis;
    }
}

【问题讨论】:

  • 列表不包含对象。它们包含对对象的引用。您的示例显示了包含对同一对象的引用的两个列表。如果您通过任一引用在一个对象上调用了 mutator 方法,则该对象将被更改。如果您更改了一个列表中的引用,它不会自动更改另一个列表中的引用。

标签: java pointers reference


【解决方案1】:

如果您想编辑对象的私有字段但没有公共方法可以做到这一点,您可以使用 Reflections(google it)。然而,这通常是一个坏主意,因为它绕过了可能存在的类内部逻辑(例如,对尝试分配的值的完整性检查,或对可能与您更改的字段相关的其他字段的内部更新)

要找到最佳解决方案,请更详细地说明您的情况。为什么你不能有该领域的二传手?是您没有源代码的第三方库吗?

【讨论】:

  • 好吧,情况就这样交给我了。任务说我不能修改任何代码。我必须修改存储在private 变量中的对象引用。我只能通过另一个数组中的引用来访问这些对象,其中一个对象是在创建时添加的(如上面的代码中所示)。
  • 我还不确定我或你是否正确理解了任务。只是为了确保:您是否必须更改第二个列表中的引用,即用另一个对象替换第二个列表中的对象,或者您是否需要修改对象本身(例如,您的苹果的“大小”字段第一个例子)?如果是后者,您是否可以访问“大小”字段?
  • 就我而言,是否更改或替换对象并不重要。是的,我必须更改第二个列表中的对象。我认为由于 我没有设置访问 size 我唯一的选择是用新属性替换对象。
  • 好吧,您无法编辑对象,也无法编辑列表。对我来说,听起来你无能为力。同样,我知道的唯一技术方法是通过反射编辑对象字段。但是你说你只能使用 java.util.* 包?所以,对不起,我没有想法
  • 那很好,还是谢谢你。无论如何,反射是一件从未听说过的好东西。
猜你喜欢
  • 2016-08-12
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多