2016-06-21 165 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

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