「これをしてはいけない」という答えを投稿しないでください。これを本番コードで使用する予定はありませんが、ハッキングを楽しむためだけに使用します。
この質問に答える際に、私は楽しみのために任意の安全でない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));
}
}