"これはしないでください"という回答を投稿しないでください。私はこれをプロダクションコードで使用する予定はありませんが、ハッキングの面白さのためにのみ使用します。Javaで安全でないコード(セキュリティマネージャを無効にする)を実行する方法はありますか?
this questionという回答には、安全でない任意のJavaコードを実行したかったのです。問題のコードは、のリーフのノードがJavaのTreeMap
であることを示しています。
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
で
実行以下のコードの結果this questionによると、私の周りこれらの制限のほとんどを得るためにSystem.setSecurityManager(null)
を使用することができます。しかし、私はクラスがロードされると、エラーがポップアップするので、これを行うことはできません。
セキュリティマネージャを無効にした後、私が反射を使用したいすべてを行うことができることは既に認識しています。しかしそれはコードをもっと醜いものにするでしょう。 コアのJava開発者は、例えばjava.util
のものをパッケージ化できない場合、どのように単体テストを書くのですか?
私も-Djava.security.manager=...
を試してみましたが、私はnull
に設定したときに、これはJVMの初期化エラーが発生し、私はそれを設定することができます他に何かわかりません。何か案は?単にあなたの質問に答えるために
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));
}
}
私はコア開発者が(パブリックインターフェイスをテストする必要があるため)異なるパッケージにテストを配置したり、セキュリティ制限のないJVMビルドを行っていることは間違いありません。結局のところ、OracleはJVMコードを書く会社です。 –
おそらく、ソース(紅茶など)を入手し、ファイルを「正しい」パッケージに没入させて、すべてをコンパイルしてみてください。私はそれが動作するかどうかは分かりませんが、システムを騙すのに十分かもしれません。それは私が試みるものです。 –
ブートストラップクラスパスを使用できます。 rt.jarとこのクラスのすべてを含む独自のjarファイルを作成します。これは醜いハックですが、あなたはハックしたいと言いました。 –