JAVA:在创建时设置成员数据,而不使用构造函数
我正在使用som生成的类,我需要在创建时设置这些类的成员数据。生成的类只有一个默认构造函数,没有成员数据的setter。修改类是没有意义的,因为当我再次重新生成类时,修改将被覆盖(这是一个共享项目,因此其他人可能也会覆盖生成的类) 有可能这样做吗 例如:JAVA:在创建时设置成员数据,而不使用构造函数,java,Java,我正在使用som生成的类,我需要在创建时设置这些类的成员数据。生成的类只有一个默认构造函数,没有成员数据的setter。修改类是没有意义的,因为当我再次重新生成类时,修改将被覆盖(这是一个共享项目,因此其他人可能也会覆盖生成的类) 有可能这样做吗 例如: public class A{ private int value; } public class B{ private A a; public void initA() { a = new A
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块中分配和实例属性。这意味着您的属性值
在您要分配它的时候根本不存在。私有变量我们不能在基类中访问,所以我认为无法在派生类中访问它