【问题标题】:MyClassLoader.defineClass java.lang.SecurityException: Prohibited package name: java.langMyClassLoader.defineClass java.lang.SecurityException:禁止的包名称:java.lang
【发布时间】:2013-07-31 21:04:48
【问题描述】:

我尝试扩展 ClassLoader。我的 ClassLoader.loadClass 是:

 protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {// i put "throw"s here to clean code below

        Class<?> result = null;


            byte[] bytes = null;
            try {
                bytes = getClassFromFS(pathToClass); //get .class file from file system in bytes[]
            } catch (FileNotFoundException ex) {
                Logger.getLogger(MyLoader.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(MyLoader.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("MyLoader:мой loadClass загружает класс");
            return defineClass(name, bytes, 0, bytes.length); // the proplem is here !!!

        return super.loadClass(name, resolve); 
}

“主”线程中的行

/*first argument - path to file. File exist, I checked it*/
myClassLoader = new MyLoader("D:\\\\customclassloader\\ClassX.class", ClassLoader.getSystemClassLoader());
classX = (SimpleInterface) myClassLoader.loadClass("customclassloader.ClassX",true).newInstance();
</pre>
then I have exception 
<pre>Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:650)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:635)
    at customclassloader.MyLoader.loadClass(MyLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:635)// the proplem is here !!!
    at customclassloader.MyLoader.loadClass(MyLoader.java:61)
    at customclassloader.CustomClassLoader.main(CustomClassLoader.java:32)

X 类:

package customclassloader;

/**
 *
 * @author roman
 */
public class ClassX {

    static {
        System.out.println("класс ClassX инициируеться");
    }

    public ClassX() {
        System.out.println("класс ClassX конструируеться");
    }

    public void f(){
        System.out.println("класс ClassX выполняет f();");
    }


}

我不明白。我将类命名为“customclassloader.ClassX”。为什么它显示名称“java.lang”? 同项目同包中编译的ClassX.class。

【问题讨论】:

    标签: java classloader


    【解决方案1】:

    它显示 java.lang 因为 java.lang.Object 是加载器试图加载的所有类的超类。

    您可以查看此链接以获取示例 http://www.javaworld.com/jw-10-1996/jw-10-indepth.html?page=2

    " 下一步是检查原始类加载器是否可以解析这个类名。这个检查对于系统的健全性和安全性都是必不可少的。例如,如果你返回你自己的 java.lang.Object 实例给调用者,那么这个对象将不会与任何其他对象共享公共超类!如果你的类加载器返回它自己的 java.lang.SecurityManager 值,系统的安全性可能会受到损害,它没有与真实的相同的检查有一个。”

    【讨论】:

      【解决方案2】:

      Java 似乎禁止你将自己的类放在包java.lang 中。 由于您正在扩展 java.lang 中的 ClassLoader,因此您的类被视为 java.lang 包的一部分。

      尝试将其放入另一个包中,在导入说明上方使用 package 语句

      PS:答案如下:java.lang.SecurityException: Prohibited package name: java.lang

      【讨论】:

      • 我不会尝试放入java.lang 包。我尝试将新课程放入我当前的包customclassloader。所以我猜loadClass("customclassloader.ClassX",true) 尝试加载不是java.lang 包。 (我的ClassX 有包装-package customclassloader;
      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2018-12-27
      相关资源
      最近更新 更多