Java 在同一个包中对sun.*类进行子类化会产生IllegalAccessError
前言:Java 在同一个包中对sun.*类进行子类化会产生IllegalAccessError,java,inheritance,visibility,core,sun,Java,Inheritance,Visibility,Core,Sun,前言: 我要告诉你们的是,我错了,我很清楚,我做了这样愚蠢的事情,破坏了封装,我有多糟糕 我不想解决任何更一般的I/O问题。这只是一个实验 我正在尝试子类sun.nio.ch.SourceChannelImpl,这是一个包私有类,在JDK(rt.jar)中有包私有构造函数,所以我必须在sun.nio.ch包中创建它 这是我的小班: package sun.nio.ch; import java.io.FileDescriptor; import java.nio.channels.spi.Sel
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: XYZ
Main
类在这个包中运行良好
我还尝试通过设置策略来禁用安全检查,允许所有操作,但这也没有帮助。我还尝试了System.setSecurityManager(null)代码>(我不确定这是否真的禁用了它),它也没有帮助
有什么问题吗?我怎样才能修好它
我已经用JDK1.7.045、Oracle和OpenJDK尝试过了。SourceChannelImpl
是一个“包私有”类。在JVM中,包始终由单个类装入器装入。如果有两个名称相同的包由不同的类加载器加载,则它们不是同一个包
您可以通过使用-Xbootclasspath/a:mybootspath
在引导类加载器中加载部分或全部代码来修复此问题