2013-07-31 29 views
1

我尝试扩展ClassLoader。我ClassLoader.loadClass是:MyClassLoader.defineClass java.lang.SecurityException:禁止包名:java.lang

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();"); 
    } 


} 

我donn't understend.I名类 “customclassloader.ClassX” 。为什么它会显示名称“java.lang”? 在相同的项目和相同的包中编译的ClassX.class。

回答

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,它没有像真正的那样执行相同的检查。“

0

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

试图把它的另一个包,在使用你的导入说明

PS顶部的package声明:答案在这里看到:java.lang.SecurityException: Prohibited package name: java.lang

+0

我不试图放入'java.lang'包。我尝试将新类放入当前包'customclassloader'中。所以我猜'loadClass(“customclassloader.ClassX”,true)'试图加载不是'java.lang'包。 (我的'ClassX'有packege - 'package customclassloader;') – Roman