java - Kelas dalaman tanpa nama dan kelas yang diwarisi, mengapa terdapat perbezaan apabila melaksanakan ClassLoader
PHP中文网
PHP中文网 2017-05-17 10:07:45
0
1
682

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 ClassloadClass(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中文网

认证0级讲师

membalas semua (1)
巴扎黑

Kod kedua pergi ke

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

MEMUATclass文件用getClass().getResourceAsStream

    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!