我尝试扩展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在同一个项目和相同的包中编译。
答案 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