覆盖超级变量Java [重复]
Posted
技术标签:
【中文标题】覆盖超级变量Java [重复]【英文标题】:Overwriting Super Variables Java [duplicate] 【发布时间】:2016-10-23 10:59:18 【问题描述】:我有一个类Client
,它有一个我无法编辑的变量privilege
。但是,我可以编辑一个扩展 Client
的类 Launcher
。 Client
中的一个方法检查权限,我想覆盖该方法之前的privilege
变量。
public class Client // I can't edit this class at all
private int privilege = 0;
public void chat(String msg)
if (privilege == 3)
// send chat packet with privileges to server
然后在一个单独的文件中:
public class Launcher extends Client // I can edit this class
// This is what I tried... it didn't work
@Override
public void chat(String msg)
int privilege = 3;
super.chat(msg);
这是我反编译的游戏的一部分,我想覆盖特权变量(作弊),我该怎么做?
【问题讨论】:
一旦你了解了变量私有的含义,你就会明白你想要完成的事情是不可能的 如果您已经在反编译游戏,为什么不编辑Client
?
我投票结束这个问题,因为没有解决方案
是的,我知道私有变量是什么,我认为社区可能有解决方法。
@user2357112 我使用的反编译器创建了一个错误的Java文件,我无法重新编译它,所以我不能使用它。
【参考方案1】:
您可以使用反射来编写private
字段。获取 field, 使其 accessible, 和 assign 成为您想要的值。可以使用类似的方法来调用私有方法。
@Override
public void chat(String msg)
try
Field field = Client.class.getDeclaredField("privilege");
field.setAccessible(true);
field.setInt(this, 3);
catch (Exception ex)
throw new RuntimeException("Failed to modify field", ex);
super.chat(msg);
【讨论】:
效果很好,谢谢。 反射访问修改似乎非常不安全(在这个具体的例子中总体没有)。 java的访问修饰符不是让变量在多态中安全吗? @EliSadoff 访问修改是特权操作,运行时可以配置为拒绝不受信任的代码使用。 @erickson 啊,我没有意识到这是一项特权行动;但是,我想我可以从被抛出的RuntimeException
推断出来。以上是关于覆盖超级变量Java [重复]的主要内容,如果未能解决你的问题,请参考以下文章
覆盖的 equals() 方法需要空检查吗? (java) [重复]
java泛型 <?扩展 A> vs <A> vs <?超级A> [重复]