繁体   English   中英

如何在没有 setter 方法的情况下设置值?

[英]How to set value without setter method?

在下面的代码片段中,如何在不使用 setter 方法的情况下设置ab的值? 可能吗? 我可以在公共构造函数中调用私有构造函数吗?

public class ABC {

    private int a;
    private int b;

    public ABC() {     
    }

    private ABC(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

ABC abc = new ABC();

您可以使用 Java 反射,但这被认为是不好的做法,应该避免。 但是,如果您确实需要:

ABC abc = new ABC();
Field abc_a = abc.getClass().getDeclaredField("a");
abc_a.setAccessible(true);
abc_a.set(abc, 20);

解释

Field abc_a = abc.getClass().getDeclaredField("a");

在 java 中,有一组称为反射的工具,其预期用途是允许动态设置类中的字段。 一个实际的用途是 GSON 库,它读取 JSON 并自动在 class 中填充相应的值。

每个 class 都有一个Class object 来辅助反射,并且每个 object 实例都有一个名为getClass()类的方法 get Calling this method will give you the Class object representing that class and using that, you can then invoke the getDeclaredField(fieldName) method which will return a Field object that allows you to do a variety of things to that field, one of which is setting价值。

abc_a.setAccessible(true);

因为被引用的字段是私有的,所以必须调用它以允许访问它。 如果是公开的,这一步可以省略。

abc_a.set(abc, 20);

这最终改变了ABC class 中字段a的值。 第一个参数是您希望更改其值的 object,第二个参数是新值。 请注意,字段对象不存储 class 信息,因此如果您希望更改ABC的不同实例的值,您可以使用相同的字段 object 并只需更改第一个参数。

如果我理解正确,您的实际问题是

我可以在公共构造函数中调用私有构造函数吗?

并没有真正与二传手有关。

是的,您可以从另一个构造函数中调用一个构造函数。 在您的示例代码中,这将如下所示:

public ABC() {
    this(0, 0); // initialze a and b via the private constructor
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM