MyClassLoader.defineClass java.lang.SecurityException:禁止的包名:java.lang

时间:2013-07-31 08:30:15

标签: java classloader

我尝试扩展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)

ClassX:

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在同一个项目和相同的包中编译。

2 个答案:

答案 0 :(得分:2)

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

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

“下一步是检查原始类加载器是否可以解析此类名。此检查对于系统的健全性和安全性都很重要。例如,如果返回自己的java.lang.Object实例对于调用者,那么这个对象将不与任何其他对象共享任何公共超类!如果你的类加载器返回了自己的java.lang.SecurityManager值,系统的安全性会受到影响,而java.lang.SecurityManager的值与真实值不同。一个人做了。“

答案 1 :(得分:0)

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

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

PS:回答如下所示:java.lang.SecurityException: Prohibited package name: java.lang