Java复杂的继承和调用类和方法

Java复杂的继承和调用类和方法,java,class,abstraction,Java,Class,Abstraction,我的java有点生疏,我必须为这个问题实现一个解决方案 在A.java中给出,其中: public class A implements Cloneable{ protected DataStorage Y = new DataStorage(); public A(DataStorage X, about 20 other inputs of different Object types){ this.Y=X; } public static DataStorage

我的java有点生疏,我必须为这个问题实现一个解决方案

在A.java中给出,其中:

public class A implements Cloneable{
  protected DataStorage Y = new DataStorage();

  public A(DataStorage X, about 20 other inputs of different Object types){
   this.Y=X;
  }

  public static DataStorage getData(){
   return this.Y;
  }
}
我的目标是在另一个文件ServletA.java中检索对象Y或X。。。它有效还是有更好的方法

public class ServletA{
  DataStorage Z = A.getData();
}
注意:是的,这不会编译,但是有解决方案吗

我对解决方案的限制:

  • 对A.java进行最小更改,因为它是遗留代码库
  • A()构造函数有20多个输入,这是一场噩梦
  • 我的架构师也不想通过将抽象类更改为抽象类来触及它
  • 无法在ServletA.java中创建的实例
EDIT1:我的问题是,是否有一种解决方案可以从ServletA.java访问X,而不必在ServletA.java中创建实例。上面的代码是一个示例,说明我想到了一种方法,但它不起作用


编辑2:如果你想否决投票,请礼貌地要求我澄清。谢谢

我很确定这段代码不会编译。您不能从静态函数引用此


您可以将
A
的一个实例传递到
ServletA
的构造函数中,并从
A.getData
中删除
static
,我很确定这段代码不会编译。您不能从静态函数引用此


您可以将
A
的实例传递到
ServletA
的构造函数中,并从
A.getData
中删除
static
。静态方法没有可用的
this
指针,因此给定的代码不会编译。是否有理由需要
getData()
是静态的?

静态方法没有可用的
this
指针,因此给定的代码无法编译。是否有理由需要
getData()
是静态的?

如果只有一个实例,则应该使用该模式。 您的ServletA代码应该是

public class ServletA {
  DataStorage Z = A.getInstance().getData();
}

如果只有一个实例,则应使用该模式。 您的ServletA代码应该是

public class ServletA {
  DataStorage Z = A.getInstance().getData();
}

您可以使用反射访问任何私有(或受保护)类字段和方法。其思想是切换安全性,获取字段或方法,获取引用/调用方法,然后打开安全性。看起来像一个黑客,但它的工作

一段时间前,我写了一个类“ClassRipper”(显然是重新发明了weel)。带有“ClassRipper”的谷歌搜索提供了一个参考:

一个方便的工具,为您的任务。请随意使用或扩展它

关于StackOverflow,有两个类似的主题:

根据“EDIT1:我的问题是,是否有一个解决方案可以从ServletA.java访问X,而不在ServletA.java中创建a的实例。上面的代码是一个示例,表明我想到了一个方法,但它不起作用。”


如果不创建A-X的实例,就无法访问X(因为它不是静态的)。但是如果您的ServletA扩展了-那么您可以使用“this”作为实例。类裂土器句柄继承。在本例中,您间接拥有一个;)

您可以使用反射访问任何私有(或受保护)类字段和方法。其思想是切换安全性,获取字段或方法,获取引用/调用方法,然后打开安全性。看起来像一个黑客,但它的工作

一段时间前,我写了一个类“ClassRipper”(显然是重新发明了weel)。带有“ClassRipper”的谷歌搜索提供了一个参考:

一个方便的工具,为您的任务。请随意使用或扩展它

关于StackOverflow,有两个类似的主题:

根据“EDIT1:我的问题是,是否有一个解决方案可以从ServletA.java访问X,而不在ServletA.java中创建a的实例。上面的代码是一个示例,表明我想到了一个方法,但它不起作用。”


如果不创建A-X的实例,就无法访问X(因为它不是静态的)。但是如果您的ServletA扩展了-那么您可以使用“this”作为实例。类裂土器句柄继承。在本例中,您间接拥有一个;)

Y
是实例特定的,您需要一个
A
的实例来访问它。解决方案的约束…无法在ServletA.java中创建A的实例。卢卡斯,我的问题是,是否有一个解决方案可以从ServletA.java访问X而不在ServletA.java中创建A的实例
A
的每个实例都包含一个
Y
。没有
A
的实例,就没有
Y
。您的getData方法不应该是静态的。另外,其他20个输入是否为同一类型?如果是这样,您可以使用var args。如果有这么多参数,您可以创建一个数据对象来传递变量。
Y
是实例特定的,您需要一个
a
的实例来访问它。解决方案的约束…无法在ServletA.java…Lukas中创建a的实例,我的问题是,是否有一种从ServletA.java访问X而不在ServletA.java中创建a实例的解决方案
a
的每个实例都包含一个
Y
。没有
A
的实例,就没有
Y
。您的getData方法不应该是静态的。另外,其他20个输入是否为同一类型?如果是这样,您可以使用var args。如果有这么多参数,可以创建一个数据对象来传递变量。OP在备注中提到了它。OP在备注中提到了它。非常酷的方法。我也会调查的谢谢。如果你觉得我的问题很有用,请向上投票,因为其他人可能会投反对票,因为他们很不耐烦:\n不要把反对票当回事。有些人只是不知道这是千人的典型问题,他们经常使用第三方LIB,没有能力改变它的设计