首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个包中的子类sun.* class提供IllegalAccessError

在同一个包中的子类sun.* class提供IllegalAccessError
EN

Stack Overflow用户
提问于 2013-12-02 14:45:36
回答 1查看 619关注 0票数 6

前言:

  1. 我要告诉你的是什么是错误的,我很清楚,我是多么糟糕的打破封装做这样愚蠢的事情。
  2. 我没有试图解决更普遍的I/O问题。只是个实验。

我正在尝试sun.nio.ch.SourceChannelImpl子类,它是包私有类,在JDK中有包私有构造函数(在rt.jar中),所以我必须在sun.nio.ch包中创建它。

这是我的子类:

代码语言:javascript
复制
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);
  }
}

以下是我的简单测试:

代码语言:javascript
复制
package sun.nio.ch;
import java.io.FileDescriptor;
public class Main {
  public static void main(String[] args) {
    new MySourceChannel(null, FileDescriptor.in);
  }
}

这就是失败的原因:

代码语言:javascript
复制
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).*)类型的问题中定义类,因为否则我会得到

代码语言:javascript
复制
java.lang.SecurityException: Prohibited package name: XYZ

Main类在这个包中工作得很好。

我还试图通过设置Policy来禁用安全检查,允许一切,但这都没有帮助。我也尝试过System.setSecurityManager(null); (我不确定这是否真的禁用它),它也没有帮助。

有什么问题吗?我该怎么修呢?

我已经在JDK 1.7.0_45 (甲骨文和OpenJDK )上试过了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-02 14:56:09

SourceChannelImpl是一个“包私有”类。在JVM中,包总是由单个类加载器加载。如果有两个名称相同的包由不同的类加载器加载,则它们不是相同的包。

您可以通过使用-Xbootclasspath/a:mybootspath在引导类加载器中加载部分或全部代码来修复此问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20331018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档