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