覆盖超级变量Java [重复]

Posted

技术标签:

【中文标题】覆盖超级变量Java [重复]【英文标题】:Overwriting Super Variables Java [duplicate] 【发布时间】:2016-10-23 10:59:18 【问题描述】:

我有一个类Client,它有一个我无法编辑的变量privilege。但是,我可以编辑一个扩展 Client 的类 LauncherClient 中的一个方法检查权限,我想覆盖该方法之前的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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java静态方法与覆盖[重复]

覆盖的 equals() 方法需要空检查吗? (java) [重复]

java泛型 <?扩展 A> vs <A> vs <?超级A> [重复]

超级简单的防止表单重复提交

爪哇。隐式超级构造函数 Employee() 未定义。必须显式调用另一个构造函数[重复]

Java Script函数变量对象