1

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。

4

2 に答える 2

2

java.lang.Object は、ローダーがロードしようとしているすべてのクラスのスーパークラスであるため、java.lang が表示されます。

このリンクのサンプルを確認できます http://www.javaworld.com/jw-10-1996/jw-10-indepth.html?page=2

" 次のステップは、原始クラスローダーがこのクラス名を解決できるかどうかをチェックすることです。このチェックは、システムの健全性とセキュリティの両方にとって不可欠です。たとえば、java.lang.Object の独自のインスタンスを呼び出し元に返す場合の場合、このオブジェクトは他のオブジェクトと共通のスーパークラスを共有しません! クラスローダーが java.lang.SecurityManager の独自の値を返した場合、システムのセキュリティが危険にさらされる可能性があります。 "

于 2013-07-31T13:04:48.917 に答える
0

Java では、独自のクラスをパッケージに入れることを禁止しているようですjava.lang。にある ClassLoader を拡張しているため、クラスはパッケージjava.langの一部と見なされます。java.lang

packageインポート手順の上にあるステートメントを使用して、別のパッケージに入れてみてください

PS:ここに見られるように答えてください:java.lang.SecurityException:禁止されたパッケージ名:java.lang

于 2013-07-31T08:36:58.170 に答える