9

「これをしてはいけない」という答えを投稿しないでください。これを本番コードで使用する予定はありませんが、ハッキングを楽しむためだけに使用します。

この質問に答える際に、私は楽しみのために任意の安全でないJavaコードを実行したいと思いました。問題のコードには、Javaのリーフノードだけを見つけることが含まれますTreeMap

以下のコードを実行すると、

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util

この質問によると、私System.setSecurityManager(null)はこれらの制限のほとんどを回避するために使用できます。しかし、クラスがロードされるときにエラーがポップアップするため、これを行うことはできません。

セキュリティマネージャを無効にした後、リフレクションを使用してやりたいことがすべてできることをすでに知っています。しかし、それはコードをはるかに醜くします。コアJava開発者は、たとえば、パッケージ化できない場合、どのように単体テストを作成しjava.utilますか?

私も試し-Djava.security.manager=...ましたが、これをに設定するとJVM初期化エラーが発生しnull、他に何に設定できるかわかりません。何か案は?

package java.util;

import java.util.TreeMap.Entry;

public class TreeMapHax {

    static <K,V> List<Entry<K, V>> getLeafEntries(TreeMap<K, V> map) {      
        Entry<K, V> root = map.getFirstEntry();
        while( root.parent != null ) root = root.parent;

        List<Entry<K,V>> l = new LinkedList<Entry<K,V>>();
        visitInOrderLeaves(root, l);
        return l;
    }

    static <K,V> void visitInOrderLeaves(Entry<K, V> node, List<Entry<K, V>> accum) {       
        if( node.left != null ) visitInOrderLeaves(node.left, accum);       
        if( node.left == null && node.right == null ) accum.add(node);      
        if( node.right != null ) visitInOrderLeaves(node.right, accum);
    }

    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<String, Integer>();

        for( int i = 0; i < 10; i++ )
            map.put(Integer.toString(i), i);

        System.out.println(getLeafEntries(map));
    }

}
4

3 に答える 3

3

あなたの質問に簡単に答えるには、通常の方法はありません

java.* のクラスは、セキュリティ マネージャーではなく、クラス ローダーによって制限されます。

やりたいことをやるには、どうにかして jvm をハックする方法を見つける必要があります。または、あなたが言ったように、リフレクションでそれを行います。または、独自のパッケージにツリーマップのコピー (ソース クローン) を作成するだけです。

于 2013-03-22T08:59:30.490 に答える
0

すべてのセキュリティロジックをスタブアウトしたカスタムjava.lang.SecurityManagerを作成し、それをカスタムJVMにコンパイルすると、後で「java.security.manager」プロパティをカスタムマネージャに設定することで参照できるようになります。

プロパティはプログラムの開始前にLauncherによって読み取られるため、独自のプログラム(コアのrt.jarファイルにバンドルされているなど)ではなく、JVMで承認されたクラスパスにカスタムSecurityManagerを含める必要があります。

コア開発者がこれにどのように対処するかについての質問に答えるには、これらの種類のテストは、本番JVMの従来のセキュリティに準拠していないため、カスタムJVMに対して実行される可能性があります。このようなスタブの一例は、ここにあります。

于 2013-03-22T09:33:06.413 に答える
0

カスタムJavaパッケージ用のjarを作成し、それを$ JRE_HOME / lib / extに置いて、魔法を見てみてください。

于 2013-03-22T11:58:43.267 に答える