请不要回答说“你不应该这样做”。我不打算在生产代码中使用它,但只是为了一些黑客的乐趣。
在回答this question时,我想运行一些任意不安全的Java代码以获得乐趣。有问题的代码只涉及查找Java TreeMap
的 leaf 节点。
运行以下代码会导致
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
根据this question,我可以使用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));
}
}
答案 0 :(得分:2)
简单回答你的问题,没有通常的方法
java。*中的类不受安全管理员的限制, 它们受到类加载器的限制。
todo你想要什么,你不知何故需要找到一种破解jvm的方法。 或者就像你提到的那样,用反射来做。 或者只是在你自己的包中创建一个treemap的副本(源克隆)。
答案 1 :(得分:0)
如果您创建了一个自定义java.lang.SecurityManager并且所有安全逻辑都被删除,并将其编译为自定义JVM,那么您应该可以通过将“java.security.manager”属性设置为您的引用来引用它自定义经理。
由于在程序启动之前Launcher读取了属性,因此您必须在JVM认可的类路径中使用自定义SecurityManager而不是您自己的程序(例如,捆绑在核心rt.jar文件中)。
回答有关核心开发人员如何处理此问题的问题:这些测试可能会针对自定义JVM运行,因为它们不符合生产JVM的传统安全性。可以找到这种存根的一个例子here。
答案 2 :(得分:0)
我想你可能会尝试为你的自定义Java包创建jar并将它放到$ JRE_HOME / lib / ext并看看魔术!!