前言:
我正在尝试sun.nio.ch.SourceChannelImpl子类,它是包私有类,在JDK中有包私有构造函数(在rt.jar中),所以我必须在sun.nio.ch包中创建它。
这是我的子类:
package sun.nio.ch;
import java.io.FileDescriptor;
import java.nio.channels.spi.SelectorProvider;
class MySourceChannel extends SourceChannelImpl {
public MySourceChannel(SelectorProvider sp, FileDescriptor fd) {
super(sp, fd);
}
}以下是我的简单测试:
package sun.nio.ch;
import java.io.FileDescriptor;
public class Main {
public static void main(String[] args) {
new MySourceChannel(null, FileDescriptor.in);
}
}这就是失败的原因:
Exception in thread "main" java.lang.IllegalAccessError: class sun.nio.ch.MySourceChannel cannot access its superclass sun.nio.ch.SourceChannelImpl
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.nio.ch.Main.main(Main.java:5)您可能无法在JDK包XYZ ((java\sun).*)类型的问题中定义类,因为否则我会得到
java.lang.SecurityException: Prohibited package name: XYZMain类在这个包中工作得很好。
我还试图通过设置Policy来禁用安全检查,允许一切,但这都没有帮助。我也尝试过System.setSecurityManager(null); (我不确定这是否真的禁用它),它也没有帮助。
有什么问题吗?我该怎么修呢?
我已经在JDK 1.7.0_45 (甲骨文和OpenJDK )上试过了。
发布于 2013-12-02 14:56:09
SourceChannelImpl是一个“包私有”类。在JVM中,包总是由单个类加载器加载。如果有两个名称相同的包由不同的类加载器加载,则它们不是相同的包。
您可以通过使用-Xbootclasspath/a:mybootspath在引导类加载器中加载部分或全部代码来修复此问题。
https://stackoverflow.com/questions/20331018
复制相似问题