有没有办法在Java中执行不安全代码(禁用安全管理器)?

有没有办法在Java中执行不安全代码(禁用安全管理器)?,java,treemap,securitymanager,package-private,Java,Treemap,Securitymanager,Package Private,请不要发布一个回答说“你不应该这样做。”我不打算在生产代码中使用这个,但只是为了一些黑客的乐趣 在回答这个问题时,我想运行一些任意的不安全Java代码以获得乐趣。所讨论的代码只涉及查找JavaTreeMap的leaf节点 运行下面的代码会导致 Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util 根据,我可以使用System.setSecurityManager(nu

请不要发布一个回答说“你不应该这样做。”我不打算在生产代码中使用这个,但只是为了一些黑客的乐趣

在回答这个问题时,我想运行一些任意的不安全Java代码以获得乐趣。所讨论的代码只涉及查找Java
TreeMap
leaf节点

运行下面的代码会导致

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
根据,我可以使用
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));
    }

}
包java.util;
导入java.util.TreeMap.Entry;
公共类树型{
静态列表getLeafEntries(树映射){
Entry root=map.getFirstEntry();
而(root.parent!=null)root=root.parent;
列表l=新的LinkedList();
visitInOrderLeaves(根,l);
返回l;
}
静态无效VisitionOrderLeaves(条目节点,列表累计){
如果(node.left!=null)visitInOrderLeaves(node.left,accum);
如果(node.left==null&&node.right==null)累加(node);
如果(node.right!=null)visitInOrderLeaves(node.right,accum);
}
公共静态void main(字符串[]args){
TreeMap map=newtreemap();
对于(int i=0;i<10;i++)
map.put(Integer.toString(i),i);
System.out.println(getLeafEntries(map));
}
}

简单地回答你的问题,没有通常的方法

java.*中的类不受安全管理器的限制, 它们受到类装入器的限制

要想做你想做的事情,你需要找到一种破解jvm的方法。 或者就像你提到的那样,用反思的方式去做。 或者只是在您自己的包中创建treemap的副本(源克隆)。

如果您创建了一个自定义,并删除了所有安全逻辑,然后将其编译到自定义JVM中,您应该能够在以后通过将“java.security.manager”属性设置为自定义管理器来引用它

由于属性是在程序启动之前由读取的,因此您必须在JVM认可的类路径中拥有自定义SecurityManager,而不是您自己的程序(例如捆绑在核心文件中)


回答您关于核心开发人员如何处理这一问题:这些测试可能会针对定制JVM运行,因为它们不遵守生产JVM的传统安全性。可以找到这样一个存根的例子。

我认为您可以尝试为您的自定义Java包创建jar,并将其放到$JRE_HOME/lib/ext中,看看它的神奇之处

我猜核心开发人员要么乐于将测试放在不同的包中(因为他们应该测试公共接口),要么拥有一个没有这些安全限制的JVM构建。毕竟,Oracle是编写JVM代码的公司。也许可以尝试获取源代码(冰茶或类似的东西),将您的文件潜入“正确”的包中,然后编译整个代码?我不知道这是否有效,但这可能足以欺骗系统。这就是我要尝试的。你可以使用引导类路径。创建您自己的jar,它包含从rt.jar到这个类的所有内容。这是一个丑陋的黑客行为,但你说你确实想黑客。