访问Java中的私有方法

时间:2016-02-01 21:38:51

标签: java

我有一个代表我游戏中关卡的课程。我正在编写一个AI,它需要能够预测世界将如何逐步对其行为作出反应。这些逐步模拟目前由私有函数处理,但我希望AI能够复制该级别的实例并访问该副本上的私有函数。

如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

如果不使用反射,则需要增加从私有到可在课堂外访问的内容的可见性。

考虑使用包私有 - 这实际上是默认的可见性修饰符,通过不添加显式修饰符来表示:

class Foo {      // A package private class.
  int bar;       // A package private field.
  void baz() {}  // A package private method.
}

此类方法仅对同一个包中的类可见 - 您可以将AI类放在同一个包中。

如果您不希望第三方能够在同一个软件包中定义类 - 这会让他们看到这些方法的可见性 - 您可以考虑使用类似sealed jar的内容。

答案 1 :(得分:2)

您可以使用反射。例如,

public class PrivateObject {

  private String privateString = null;

  public PrivateObject(String privateString) {
    this.privateString = privateString;
  }

  private String getPrivateString(){
    return this.privateString;
  }
}

对于这门课程,

PrivateObject privateObject = new PrivateObject("The Private Value");

Method privateStringMethod = PrivateObject.class.getDeclaredMethod("getPrivateString", null);

privateStringMethod.setAccessible(true);

String returnValue = (String) privateStringMethod.invoke(privateObject, null);

System.out.println("returnValue = " + returnValue);

了解更多here

答案 2 :(得分:0)

非反射答案(因为我不想在运行时插入访问权限):将访问修饰符从private更改为protected,扩展主类并使用public修饰符创建一个新方法,可以从中调用原始方法。

这样,真实级别仍然不能被不适当地改变,AI可以使用所需的功能。