我有一个代表我游戏中关卡的课程。我正在编写一个AI,它需要能够预测世界将如何逐步对其行为作出反应。这些逐步模拟目前由私有函数处理,但我希望AI能够复制该级别的实例并访问该副本上的私有函数。
如何实现这一目标?
答案 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可以使用所需的功能。