この記事では、主に、次のように、JARおよびクラスファイルのJava動的荷重の関連コンテンツを研究しています。
Javaにロードされるクラスファイルは動的です。言い換えれば、使用したときにのみロードし、使用しない場合はクラスをロードしません。
Javaは、2つの動的メカニズムを提供します。 1つ目は暗黙のメカニズムです。 2番目はディスプレイメカニズムです。次のように:
2つの方法:
class.forname()メソッドには2つのフォームがあります。
public static Class forName(String className)public static Class forName(String className, boolean initialize,ClassLoader loader)1つのパラメーターのみでforname()メソッドを呼び出すことは、class.forname(classname、true、loader)に相当します。
両方の方法は、最後にNative Method forname0()に接続する必要があります。
forName()3つのパラメーターを使用すると、最後の呼び出しは次のとおりです。forname0(name、initialize、roader);
特定のクラスをインスタンス化するために新しい使用を使用している場合でも、1つのパラメーターのみを備えたclass.forname()メソッドを使用している場合でも、「class + running static code blocks」のステップが内部に暗示されています。
3つのパラメーターを使用してclass.forname()メソッドを使用する場合、2番目のパラメーターがfalseの場合、クラスローダーはクラスのみをロードし、静的コードブロックを初期化しません。クラスがインスタンス化された場合にのみ、静的コードブロックが初期化されます。静的コードブロックは、クラスが初めてインスタンス化されたときに初期化されます。
クラスローダーはクラスのロードに使用されます。クラスがロードされると、このクラスが参照するすべてのクラスもロードされ、このロードは再帰的です。つまり、aがbとbを指す場合、bがcを指す場合、aがロードされると、bもロードされ、bがロードされると、cもロードされます。すべての必要なクラスがうまくロードされるまで再帰的です。
パッケージcom.demo.test; import java.io.io.bytearrayoutputStream; Import java.io.file; import java.io.fileinputStream; Import java.io.fileenotfoundexception; Import java.io.ioexception; Import java.lang.reflect. java.lang.reflt.method; Import java.net.malformedurlexception; Import java.net.url; import java.net.urlclassloader; public class dynamicloaddemo {enum filetype {jar、class、other} static class classloaderss extends extends extense filenotfoundexception {class <? fis.read(buffer); if(len == -1){break;} baos.write(buffer、0、len);} // fileinputstreamのフラッシュは空の操作です。ここには必要ないので空です。 //baos.flush(); byte [] data = baos.tobytearray(); return defineclass(null、data、0、data.length);} catch(ioexception e){exprintstacktrace();}最後に{try {baos.close();} catch(ioxception e {fis.close();} catch(ioexception e){e.printstacktrace();}} return null;}} public static void main(string classname = "com.demo.test.hellowld"; {string lowerpath = path.tolowercase(); filetype filetype = filetype.other; if(lowerpath.endswith( "。jar")|| lowerpath.endswith( "。zip")){filetype = filetype.jar;} else if(lowerpath.endswith( "。 (filetype == filetype.other){return;} file file = new file(path); if(!file.exists()){return;} try {url url = file.touri(); system.out.println(url.tostring()); class <? = new URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader());cls = classLoader.loadClass(className);break;case CLASS: MyClassLoader myClassLoader = new MyClassLoader();cls = myClassLoader.loadClass(className, file);break;default: break;}if (cls == null){return;} //インスタンス変数フィールドフィールド= cls.getDeclaredfield( "hello"); if(!field.isaccessible()){field.setaccessible(true);} system.out.println(field.get(cls.newinstance()); cls.getdeclaredmethod( "saystatichello"、null); if(!staticmethod.isaccessible()){staticmethod.setAcsible(true);} //関数の返品値がvoid、nullstaticmethod.invoke(cls、null); //パラメータを備えたインスタンスメソッドメソッドメソッド= cls.getdeclaredmethod( "、String);"、String); {method.setAccessible(true);} object ret = method.invoke(cls.newinstance()、 "hello world"); system.out.println(ret);} catch(e.printstacktrace();} catch(classnotfoundexception e){e.printstacktrace();} catch(); {e.printstacktrace();} catch(securityexception e){e.printstacktrace();} catch(legalaccessexception e){e.printstacktrace();} catch(Illegalargumentexception e){e.printstacktrace();} catch(} catch(} catchextexception() (instantiationexception e){e.printstacktrace();} catch(nosuchfieldexception e){e.printstacktrace();} catch(filenotfoundexception e){e.printstacktrace();}}}}}}結果:
上記は、Java Dynamic Loading JARとクラスファイルインスタンスの分析に関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!