请不要发布“你不应该这样做”的答案。我不打算在生产代码中使用它,而只是为了一些黑客的乐趣。
在回答这个问题时,我想运行一些任意不安全的 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));
}
}