重写/更改对象以更改引用而无需使用setter

时间:2019-03-14 17:02:57

标签: java pointers reference

我很难弄清楚是否可以在不使用类设置器方法的情况下更改所有引用。 我也仅限于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<Apple> second中的同一对象。我没有直接访问List<Apple> 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;
    }
}

1 个答案:

答案 0 :(得分:-1)

如果您要编辑对象的私有字段,但是没有公共方法可以执行此操作,则可以使用 Reflections (将其搜索)。但是,这通常是一个坏主意,因为它绕过了可能存在的类内部逻辑(例如,对尝试分配的值进行完整性检查,或对可能与您更改的字段相关的其他字段进行内部更新)

要找到最佳解决方案,请详细说明您的情况。为什么您不能在现场设置塞特犬?是您没有源的某些第三方库吗?