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

前言:

  • 我要告诉你们的是,我错了,我很清楚,我做了这样愚蠢的事情,破坏了封装,我有多糟糕
  • 我不想解决任何更一般的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.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
    在引导类加载器中加载部分或全部代码来修复此问题