2016-06-21 3 views
0

私はクラスClientを持っていますが、私は編集できない変数privilegeを持っています。しかし、私はを拡張するクラスLauncherを編集することができます。 Clientのメソッドが特権をチェックしており、そのメソッドの前に変数privilegeを上書きしたいと思います。スーパー変数を上書きするJava

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

これは私が逆コンパイルきたゲームの一部であり、私は特権変数(チート)を上書きしたいのですが、どのように私はこれを達成することができます:別々のファイルに続いて

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

+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に影響しますか?

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

これは、両方のクラスことを前提としています

あなたは、これらのクラスを使用しClientprivilegeためのゲッター、セッターを実装したり、protected

+0

これは正解です。リフレクションを使用してプライベートフィールドに入る可能性もありますが、それはクライアントAPIの契約の面で面倒で飛びます。 – nasukkin

+0

「このクラスはまったく編集できません」という部分を見落としました。 – Robert

+0

@nasukkin:契約の面での飛行がポイントです。 – user2357112

-1

に変数の可視性を変更する必要があります同じパッケージに入っています。それらが異なるパッケージにある場合は、Clientクラスのprivilegeの可視性をClientクラスに変更してください。

+0

あなたはそれをコピーしたにもかかわらず、 "このクラスを全く編集できません"を見逃しました... – Robert

+0

おっと私の悪い..この回答を無視してください。 –

関連する問題