请不要发表回答“你不应该这样做”。我不打算在生产代码中使用它,但只是为了一些黑客的乐趣。有没有办法在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=...
但是这会导致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));
}
}
我猜测核心开发人员不是很乐意将他们的测试放在不同的包中(因为他们应该测试公共接口),或者让JVM构建没有这些安全限制。毕竟,Oracle是编写JVM代码的公司。 – 2013-03-22 06:08:04
也许尝试获取源代码(冰茶或类似的东西),偷偷把你的文件放到“正确”的包中,然后编译整个东西?我不知道这是否会起作用,但它可能足以欺骗系统。这就是我想要的。 – 2013-03-22 07:11:51
您可以使用引导类路径。创建你自己的jar包含rt.jar和这个类的所有内容。这是一个丑陋的黑客,但你说你确实想要黑客入侵。 – 2013-03-22 07:53:33