4

Java を発明した人々は、なぜsetAccessible(boolean flag)アクセス修飾子 (特にプライベート) を役に立たなくし、フィールド、メソッド、コンストラクターへのアクセスを保護できない のようなメソッドを作成したのでしょうか? 次の簡単な例を見てください。

public class BankAccount
{
    private double balance = 100.0;

    public boolean withdrawCash(double cash)
    {
        if(cash <= balance)
        {
            balance -= cash;
            System.out.println("You have withdrawn " + cash + " dollars! The new balance is: " + balance);
            return true;
        }
        else System.out.println("Sorry, your balance (" + balance + ") is less than what you have requested (" + cash + ")!");
        return false;
    }
}

import java.lang.reflect.Field;

public class Test
{
    public static void main(String[] args) throws Exception
    {
        BankAccount myAccount = new BankAccount();
        myAccount.withdrawCash(150);

        Field f = BankAccount.class.getDeclaredFields()[0];
        f.setAccessible(true);
        f.set(myAccount, 1000000); // I am a millionaire now ;)

        myAccount.withdrawCash(500000);
    }
}

出力:

Sorry, your balance (100.0) is less than what you have requested
(150.0)! You have withdrawn 500000.0 dollars! The new balance is: 500000.0
4

2 に答える 2

6

一部のコードは信頼できるコードであるため、つまり、ローカル アプリケーションがこれを実行したい場合、それは大したことではない可能性があります。ただし、信頼できないコード(つまり、アプレット、Web 開始アプリケーション、RMI スタブ、またはその他のダウンロードされたコード) の場合SecurityManagerは、(通常はポリシー ファイルに基づいて) 「申し訳ありません」と言う機会がある場所にあります。 、チャーリー」と要求を拒否しsetAccessible()ます。

于 2012-09-02T16:20:20.397 に答える
2

Java プログラムをリリースしたら、誰でもリバース エンジニアリングや逆コンパイルを自由に行うことができます。

ただし、できることは、外部コードがランタイム内のものにアクセスすることを禁止することです。つまり、たとえば、他の誰かのコードを使用している場合、それらのライブラリが使用される前に、リフレクションやファイルへのアクセスなどを無効にすることができます。

詳細については、ClassLoader および Security Manager を検索してください。関連するものを次に示します。

于 2012-09-02T16:24:52.020 に答える