Rumah  >  Soal Jawab  >  teks badan

java - Kelas dalaman tanpa nama dan kelas yang diwarisi, mengapa terdapat perbezaan apabila melaksanakan ClassLoader

Saya sedang melihat mesin maya Java baru-baru ini, dan bahagian pemuat kelas memberikan contoh ini:

/**
*类加载器与instanceof关键字演示
**
@author zzm
*/
public class ClassLoaderTest{
    public static void main(String[]args) throws Exception{
        ClassLoader myLoader=new ClassLoader(){
            @Override
            public Class<?>loadClass(String name)throws ClassNotFoundException{
                try{
                    String fileName=name.substring(name.lastIndexOf(".")+1)+".class";
                    InputStream is=getClass().getResourceAsStream(fileName);
                    if(is==null){
                        return super.loadClass(name);
                    }
                    byte[]b=new byte[is.available()];
                    is.read(b);
                    return defineClass(name,b,0,b.length);
                }
                catch(IOException e){
                    throw new ClassNotFoundException(name);
                }
            }
        }
        ;
        Object obj=myLoader.loadClass("org.fenixsoft.classloading.ClassLoaderTest").newInstance();
        System.out.println(obj.getClass());
        System.out.println(obj instanceof org.fenixsoft.classloading.ClassLoaderTest);//false
    }
}

Ringkasnya, anda menggunakan pemuat kelas tersuai untuk memuatkan kelas Kelas yang dikembalikan adalah berbeza daripada kelas yang dimuatkan oleh SystemClassLoader yang disertakan dengan jvm.

Kemudian jika anda menggunakan kelas yang mewarisi daripada ClasserLoader, wajarlah bahawa ia akan mempunyai kesan yang sama

package jvm;
public class MyClassLoader extends ClassLoader{

    @Override
    public Class<?> loadClass(String fullClassName) throws ClassNotFoundException{
        try {
            String fileName = fullClassName.substring(fullClassName.lastIndexOf(".")+1,fullClassName.length())+".class";
            InputStream is = getResourceAsStream(fileName);

            if(is==null){
                return super.loadClass(fullClassName);
            }

            byte[] bytes = new byte[is.available()];
            is.read(bytes);

            return defineClass(fullClassName,bytes,0,bytes.length);
        }catch (Exception e){
            throw new ClassNotFoundException();
        }
    }

    public static void main(String[] args) throws Exception{

        ClassLoader myClassLoader = new MyClassLoader();

        /**
        ClassLoader myClassLoader = new ClassLoader() {
            @Override
            public Class<?> loadClass(String fullClassName) throws ClassNotFoundException {
                try {
                    String fileName = fullClassName.substring(fullClassName.lastIndexOf(".")+1,fullClassName.length())+".class";
                    InputStream is = getClass().getResourceAsStream(fileName);

                    if(is==null){
                        return super.loadClass(fullClassName);
                    }

                    byte[] bytes = new byte[is.available()];
                    is.read(bytes);

                    return defineClass(fullClassName,bytes,0,bytes.length);
                }catch (Exception e){
                    throw new ClassNotFoundException();
                }
            }
        };
        /**/

        ClassLoader systemClassLoader = java.lang.ClassLoader.getSystemClassLoader();

        Class myClass = myClassLoader.loadClass("jvm.MyClassLoader");
        Class systemClass = systemClassLoader.loadClass("jvm.MyClassLoader");

        Object myObj = myClass.newInstance();
        Object systemObj = systemClass.newInstance();

        System.out.println(myClass.equals(systemClass));//true
        System.out.println(myObj.getClass().equals(systemObj.getClass()));//true

    }
}

Kod dalam ulasan adalah warisan kelas dalaman tanpa nama Perhatikan bahawa myClass dan systemClass adalah sama sepenuhnya, tetapi myClass dijana menggunakan kelas MyClassLoader yang diwarisi daripada ClassLoader. . .

PHP中文网PHP中文网2736 hari yang lalu761

membalas semua(1)saya akan balas

  • 巴扎黑

    巴扎黑2017-05-17 10:09:45

    Kod kedua pergi ke

    if(is==null){
        return super.loadClass(fullClassName);
    }

    MEMUATclass文件用getClass().getResourceAsStream

    balas
    0
  • Batalbalas