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

And*_*Mao 7 java securitymanager treemap package-private

请不要回答说"你不应该这样做".我不打算在生产代码中使用它,但仅限于一些黑客的乐趣.

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

运行以下代码会导致

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
Run Code Online (Sandbox Code Playgroud)

根据这个问题,我可以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));
    }

}
Run Code Online (Sandbox Code Playgroud)

fmt*_*MKO 3

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

java.* 中的类不受安全管理器的限制,而是受类加载器的限制。

为了做你想做的事,你需要找到一种方法来破解 jvm。或者只是按照你提到的那样做,进行反思。或者只是在您自己的包中创建树形图的副本(源克隆)。