2016-06-21 168 views
0

我有一个类Client,其中有一个变量privilege,我无法编辑。然而,我可以编辑Launcher类别,它扩展了ClientClient中的方法检查权限,并且我想在该方法之前覆盖privilege变量。覆盖超级变量Java

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); 
    } 
} 

这是一个游戏,我反编译的一部分,我想改写特权变量(作弊),我怎么能做到这一点?

+2

一旦你了解这是什么意思一个变量是私有的,你会明白,你所要完成是不可能的 – ControlAltDel

+0

如果您已经在反编译的游戏,为什么*不*'编辑Client' ? – user2357112

+0

我投票结束这个问题作为题外话,因为没有解决方案 – ControlAltDel

回答

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); 
} 
+0

工作很好,谢谢。 –

+0

反射访问修改看起来令人难以置信的不安全(总体而言不在此特定示例中)。 java的访问修饰符不是使多态变量安全吗? –

+0

@EliSadoff访问修改是一项特权操作,可以将运行时配置为拒绝不可信代码的使用。 – erickson

-1

int privilege = 3是局部变量,怎么会影响类Client

你需要实现的getter,setter方法privilegeClient或改变变量能见度protected

+0

这是正确的答案。您也可以使用反射来访问私人领域,但这很混乱,而且在Client API的合同面前飞翔。 – nasukkin

+0

您错过了“根本无法编辑此课程”部分。 – Robert

+0

@nasukkin:面对合同的飞行是重点。 – user2357112

-1

使用这些类:

public class Client { // I can't edit this class at all 

    protected 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) { 
     this.privilege = 3; 
     super.chat(msg); 
    } 
} 

这假定两个类是在同一个包中。如果它们位于不同的包中,请将privilege的可见性更改为public int privilege中的Client

+0

您错过了“根本无法编辑此课程”,即使您已将其复制... – Robert

+0

哎呀,我的不好..请忽略此答案.. –