JAVA:在创建时设置成员数据,而不使用构造函数

JAVA:在创建时设置成员数据,而不使用构造函数,java,Java,我正在使用som生成的类,我需要在创建时设置这些类的成员数据。生成的类只有一个默认构造函数,没有成员数据的setter。修改类是没有意义的,因为当我再次重新生成类时,修改将被覆盖(这是一个共享项目,因此其他人可能也会覆盖生成的类) 有可能这样做吗 例如: public class A{ private int value; } public class B{ private A a; public void initA() { a = new A

我正在使用som生成的类,我需要在创建时设置这些类的成员数据。生成的类只有一个默认构造函数,没有成员数据的setter。修改类是没有意义的,因为当我再次重新生成类时,修改将被覆盖(这是一个共享项目,因此其他人可能也会覆盖生成的类)

有可能这样做吗

例如:

public class A{
    private int value;
}

public class B{
    private A a;
    public void initA()
    {
        a = new A(){
            value = 9;
        };
    }
}

如果没有参数构造函数,则必须使用setter来设置私有成员。

类似的内容将允许您设置私有字段的值
A.value

public class A{
    private int value;
   static{
       value=10;
  }
}

public class B{
    private A a;
    public void initA()
    {
        a = new A();
    }
}
class A {
    private int value;

    @Override
    public String toString() {
        return "Value of my private field: " + value;
    }
}

class MutableA {
    public A a;
    private Field value;

    public MutableA(A a) {
        this.a = a;
        try {
            this.value = A.class.getDeclaredField("value");
        } catch (NoSuchFieldException | SecurityException e) {
            e.printStackTrace();
        }
        this.value.setAccessible(true);
    }

    void setValue(int value) {
        try {
            this.value.set(a, value);
        } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
您可以这样使用它:

public class Test{
    public static void main(String[] args) {
        A a = new A();
        System.out.println("before mutation:" + a);

        MutableA mutableA = new MutableA(a);
        mutableA.setValue(1);
        System.out.println("before mutation: " + a);
    }
}
输出:

变异前:我的私有字段值:0
突变前:我的私有字段值:1

我不确定您想要实现什么,以及为什么覆盖无参数构造函数是不可能的。此外,如果您希望他们无法“覆盖”您的构造函数,请将
声明为
最终
(您无论如何都无法更改它)-如果有人删除了你的构造函数-他会得到一个编译时错误,并理解他做错了什么-如果字段是私有的,没有初始化和设置程序,听起来生成的类是无用的。我建议您修复生成器。如果不想添加getter和setter,您可以使用反射或将属性修改为protected。但是我听起来你应该证明你的设计你可以使用反射,但是如果代码生成是固定的,以产生合理的代码,那就更好了。没有不能设置的私有字段。在这里,我们在创建时分配成员变量,而不使用构造函数。OP不想修改类A。如果允许他/她这样做,那么我们可以让成员函数这样做,即使他这样做,解决方案也不会编译。您正在静态init块中分配和实例属性。这意味着您的属性
在您要分配它的时候根本不存在。私有变量我们不能在基类中访问,所以我认为无法在派生类中访问它