1

我的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。通过从 A.java 类进行静态调用......它是否有效或有更好的方法?

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

注意:是的,这不会编译,但有解决方案吗?

我对解决方案的限制:

  • 对 A.java 进行最小的更改,因为它是遗留代码库
  • A() 构造函数有许多 20 多个输入,这是一场噩梦
  • 我的架构师也不想通过将 A 更改为抽象类来触及它
  • 无法在 ServletA.java 中创建 A 的实例

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

编辑2:如果您想投反对票,请出于礼貌要求我进行澄清。谢谢!

4

4 回答 4

1

如果您只有一个 A 实例,则应使用单例模式。您的 ServletA 代码应该类似于

public class ServletA {
  DataStorage Z = A.getInstance().getData();
}
于 2012-07-23T15:44:25.057 回答
1

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

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

http://www.koders.com/java/fid7E7F02066CC24469AC29D8A3EB9F74D655E53588.aspx

一个方便的工具来完成您的任务。随意使用或扩展它。

StackOverflow 上有 2 个类似的主题:

Java中是否可以通过反射访问私有字段

如何读取 Java 中的私有字段?

根据“EDIT1 更新:我的问题是是否有解决方案可以从 ServletA.java 访问 X 而无需在 ServletA.java 中创建 A 的实例。上面的代码是一个示例,表明我已经想到了一种方法,但是它不行。”

您不能在不创建 A 实例的情况下访问 X - X 不存在(因为它不是静态的)。但是,如果您的 ServletA 扩展了 A - 那么您可以使用“this”作为实例。ClassRipper 处理继承。在这种情况下,您间接拥有 A 的实例;)

于 2012-07-23T15:57:10.807 回答
0

我很确定这段代码不会编译。您不能对this静态函数进行引用。

您可以将 in 的实例传递给A构造函数并从中ServletA删除。staticA.getData

于 2012-07-23T15:40:19.710 回答
-1

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

于 2012-07-23T15:41:46.603 回答