การสะท้อนชวาที่กล่าวถึงในครั้งนี้เกี่ยวข้องกับรหัสจำนวนมาก เนื่องจากการสะท้อนกลับมักใช้ในการทำงานเราจึงได้ทำสิ่งที่เป็นนามธรรมและตัวกรองจำนวนมากไปยังรหัส แม้ว่ารหัสจะมีขนาดใหญ่ แต่ก็ใช้งานง่ายและใช้งานง่ายและปลั๊กอินตัวกรองก็สามารถปรับเปลี่ยนได้ง่าย
ต่อไปนี้เป็นคำอธิบายว่าการสะท้อนกลับใช้งานได้ง่ายกว่าในที่ทำงาน ตัวอย่างเช่นปลั๊กอินหรือตัวกรองหากมีคลาสย่อยที่เป็นนามธรรมน้อยลงการกำหนดค่าให้กับ XML และโครงสร้างอื่น ๆ ก็สามารถบรรลุผลได้เช่นกัน หากคุณต้องการมีความยืดหยุ่นมากขึ้นคุณสามารถใช้งานได้โดยตรงหลังจากเพิ่มปลั๊กอินหรือคลาสย่อยรหัสกรอง มันอาจจะดีกว่าที่จะไตร่ตรองและคลาสย่อยทั้งหมดที่สืบทอดมานั้นได้มาจากการสแกนไฟล์คลาสหรือ JAR ทั้งหมด หากคุณสแกนไฟล์ทั้งหมดทุกการโทรมันจะส่งผลกระทบต่อประสิทธิภาพ ดังนั้นแคชสะท้อนกลับจะถูกเพิ่มเข้าไปในการใช้งานเพื่อแคชผลลัพธ์การสะท้อนทั้งหมดเป็นกุญแจสำคัญสำหรับพารามิเตอร์ทั้งหมดที่เกี่ยวข้องในการได้รับคลาสย่อยการสะท้อน หากเป็นคีย์เดียวกันในครั้งต่อไปคุณจะไม่กู้ภัย
ตัวอย่างรหัสมีดังนี้:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ตั้งค่าช่วงการสแกนซึ่งอาจเป็นตำแหน่งของไฟล์คลาสเช่นตำแหน่งภายใต้ถังขยะหรือจุดเริ่มต้นของ mysql หรือจุดสิ้นสุดของ mysql, // set "" เพื่อสแกนทั้งหมด ลอง {// คุณสามารถตั้งค่าการสแกนเต็มทุกครั้งในขั้นตอนการดีบัก // beans.setdesigntime (จริง); คอลเลกชันสุดท้าย <String> ชนิดย่อย = rechInthUtils.listsubClass (ia.class); // สำหรับ (สตริงสุดท้ายชนิดย่อย: ชนิดย่อย) {// สิ่งที่คุณได้รับที่นี่คือ system.out.println (ชนิดย่อย); IA Final Impl = reflectutils.initclass (subtype, ia.class); if (null == Impl) ดำเนินการต่อ; // ด้วยวิธีนี้คุณสามารถดำเนินการในลักษณะที่เป็นเอกภาพ, impl.print (); }} catch (exception e) {e.printstacktrace (); -ผลการดำเนินการรหัส:
// แคชไฟล์เพื่อหลีกเลี่ยงการ rescanning ทุกครั้งที่มีการเรียกว่า // ถ้าคุณลบไฟล์มันจะถูกกู้คืนเมื่อการสะท้อนกลับถูกเรียกอีกครั้ง โดยทั่วไปไฟล์จะถูกลบเมื่อมีคลาสย่อยในรหัส Xmlutils.readxml ความล้มเหลว: ./ configuration.ref (ระบบไม่สามารถค้นหาไฟล์ที่ระบุ) net.simple.reflect.test.bnet.simple.reflect.test.bnet.simple.reflect.test.bnet.simple.test.
สำหรับรายละเอียดโปรดดูซอร์สโค้ด นี่คือรหัสคลาสหลักสองรหัส ที่อยู่ซอร์สโค้ด: https://git.oschina.net/eliyanfei/api_tools
แพ็คเกจ Net.simple.reflect; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า java.net.jarurlconnection; นำเข้า java.net.url; นำเข้า java.net.urldecoder; นำเข้า Java.util.arraylist; java.util.linkedhashmap; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า java.util.concurrent.timeunit; นำเข้า java.util.jar.jarentry; นำเข้า Java.util.jar.jarfile net.simple.reflect.filter.ipathurlfilter; นำเข้า net.simple.reflect.filter.isubtypefilter; นำเข้า net.simple.reflect.filter.itypefilter; นำเข้า org.w3c.dom.document; [email protected] * 2 พฤศจิกายน 2016 เวลา 3:23:49 น. * */การสะท้อนระดับสุดท้ายของสาธารณะ {คอลเลกชันสุดท้ายส่วนตัว <url> pathurls; คอลเลกชันสุดท้ายส่วนตัว <IpathurlFilter> PathurlFilters; คอลเลกชันสุดท้ายส่วนตัว <Etypefilter> typeFilters; Private Isubtypefilter subtypefilter; การสะท้อนสาธารณะ () {typeFilters = new ArrayList <ItyPefilter> (); pathurlFilters = new ArrayList <iPathurlFilter> (); this.pathurls = classpathhelper.geturlsforcurrentclasspath (); } การสะท้อนสาธารณะ (คอลเลกชันสุดท้าย <url> pathurls) {this.pathurls = pathurls; typeFilters = new ArrayList <ItyPefilter> (); pathurlFilters = new ArrayList <iPathurlFilter> (); } / ** * @param subtypefilter * ตัวพิมพ์ย่อยย่อยเพื่อตั้งค่า * / โมฆะสาธารณะ setsubtypefilter (ขั้นสุดท้าย isubtypefilter subtypefilter) {this.subtypefilter = subtypefilter; } / ** * @return the subtypefilter * / public isubtypefilter getSubtypefilter () {return subtypefilter; } การสะท้อนสาธารณะ addPathurlFilter (สุดท้าย iPathurlFilter pathurlFilter) {ถ้า (null == pathurlFilter) ส่งคืนสิ่งนี้; if (! this.pathurlfilters.contains (pathurlfilter)) this.pathurlfilters.add (pathurlfilter); คืนสิ่งนี้; } การสะท้อนสาธารณะ addTypefilter (สุดท้าย itypefilter typeFilter) {ถ้า (null == typeFilter) ส่งคืนสิ่งนี้; if (! this.typefilters.contains (typeFilter)) this.typefilters.add (typeFilter); คืนสิ่งนี้; } สตริงสุดท้ายคงที่ส่วนตัว histfile = "./configuration.ref"; Histdom เอกสารส่วนตัว; คอลเลกชันสาธารณะ <String> getSubTypesfast (คลาสสุดท้าย <?> basetype) {//, สตริงสุดท้าย ... typenames // ตัวกรองแรกออกเส้นทางที่ได้รับอนุญาตให้สแกนสตริงสุดท้าย bufpathsid = new StringBuilder (32); แผนที่สุดท้าย <ไฟล์, url> fileUrls = ใหม่ linkedHashMap <ไฟล์, url> (8); สำหรับ (URL ขั้นสุดท้าย pathurl: pathurls) {ถ้า (! AsconcePathurl (pathurl)) ดำเนินการต่อ; ไฟล์ไฟล์ = null; ลอง {file = ไฟล์ใหม่ (urldecoder.decode (pathurl.getFile (), "UTF-8")); } catch (ข้อยกเว้นสุดท้าย e) {file = ไฟล์ใหม่ (pathurl.getFile ()); } fileUrls.put (ไฟล์, pathurl); if (! file.exists ()) // เป็นไฟล์ url หรือไม่ไม่สนใจดำเนินการต่อ; bufpathsid.append (file.getName ()). ผนวก (file.lastModified ()); } สตริงสุดท้าย domid = md5.gethashstring (bufpathsid.toString ()); ถ้า (null == histdom) hisdom = w3cutils.readxml (histfile); ถ้า (null == histdom) hisdom = w3cutils.newdom ("r"); Element Rootele = histdom.getDocumentElement (); if (null == rootele) histdom.AppendChild (rootele = histdom.createElement ("r")); if (! domid.equals (rootele.getAttribute ("id"))) {rootele.getParentNode (). RemoveChild (rootele); histdom.appendchild (rootele = histdom.createelement ("r")); rootele.setAttribute ("id", domid); } สตริงสุดท้าย basetypeId = md5.gethashstring (basetype.getName ()); องค์ประกอบ refele = w3cutils.firstchildelement (rootele, "e", "id", basetypeid); if (null! = refele) {รายการสุดท้าย <Element> valueEles = W3Cutils.ChildElementList (refele, "f"); คอลเลกชันสุดท้าย <String> result = new ArrayList <String> (valueEles.Size ()); สำหรับ (องค์ประกอบสุดท้ายค่า ValueLe: ValueLes) {result.add (สตริงใหม่ (base64.decodefast (valuelele.getAttribute ("id"))))); } ผลตอบแทนผลลัพธ์; } Final ThreadPool <ListSubTypes> pool = new ThreadPool <liStSubTypes> (); สำหรับ (ไฟล์ไฟล์สุดท้าย: fileUrls.keyset ()) {pool.execute (listsubtypes ใหม่ (basetype, filekey, fileurls.get (filekey))); } ลอง {pool.shutdown (3, timeUnit.minutes); } catch (final interruptedException e) {e.printStackTrace (); // สำหรับการดีบัก} คอลเลกชันสุดท้าย <string> result = new ArrayList <String> (); สำหรับ (งานสุดท้าย listsubtypes: pool.getThreadRunables ()) {result.addall (task.result); } refele = w3cutils.addele (rootele, "e"); refele.setAttribute ("id", basetypeId); สำหรับ (สตริงสุดท้าย ITM: ผลลัพธ์) {w3cutils.addele (refele, "f"). setAttribute ("id", base64.encodeToString (itm.getBytes (), false)); } ลอง {w3cutils.writexmldocument (histfile, histdom); } catch (ข้อยกเว้นสุดท้าย e) {} ผลการส่งคืน; } / ** * @See {@Link ReflectUtils#createsharedReflections (สตริง ... )} * @See {@Link ReflectUtils#setSharedReflections (ภาพสะท้อน)} * @See {@link String ... Typenames) {// Final ThreadPool <ListSubTypes> pool = new ThreadPool <listsubTypes> (); สำหรับ (URL ขั้นสุดท้าย pathurl: pathurls) {ถ้า (! AsconcePathurl (pathurl)) ดำเนินการต่อ; ไฟล์ไฟล์ = null; ลอง {file = ไฟล์ใหม่ (urldecoder.decode (pathurl.getFile (), "UTF-8")); } catch (ข้อยกเว้นสุดท้าย e) {file = ไฟล์ใหม่ (pathurl.getFile ()); } pool.execute (listsubtypes ใหม่ (basetype, ไฟล์, pathurl, typenames)); } ลอง {pool.shutdown (3, timeUnit.minutes); } catch (final interruptedException e) {e.printStackTrace (); // สำหรับการดีบัก} คอลเลกชันสุดท้าย <string> result = new ArrayList <String> (); สำหรับ (งานสุดท้าย listsubtypes: pool.getThreadRunables ()) {result.addall (task.result); } ผลตอบแทนผลลัพธ์; } คลาส listsubTypes ใช้ runnable {ไฟล์ไฟล์สุดท้าย; ชั้นสุดท้าย <?> basetype; pathurl URL สุดท้าย; สตริงสุดท้าย [] Typenames; Public ListSubTypes (คลาสสุดท้าย <?> basetype, ไฟล์ไฟล์สุดท้าย, pathurl URL สุดท้าย, สตริงสุดท้าย ... typenames) {this.basetype = basetype; this.file = ไฟล์; this.pathurl = pathurl; this.typenames = typenames; } คอลเลกชัน <String> result = new ArrayList <String> (4); @Override โมฆะสาธารณะเรียกใช้ () {if (file.isdirectory ()) {listsubtypesfromdirectory (ไฟล์, basetype, pathurl, ไฟล์, ผลลัพธ์, typenames); } else listsubtypesfromjar (basetype, pathurl, ผลลัพธ์, typenames); }} / ** * @param basetype * @param pathurl * @param result * / โมฆะสาธารณะ listsubtypesfromdirectory (ไฟล์สุดท้ายที่อิงกับไฟล์สุดท้าย, คลาสสุดท้าย < if (null == ไฟล์) ไฟล์ = ไฟล์ใหม่ [] {}; String Clazzpath; int basedirlen สุดท้าย = basedirectory.getabsolutepath (). ความยาว () + 1; สำหรับ (ไฟล์ไฟล์สุดท้าย: ไฟล์) {if (file.isdirectory ()) {listsubtypesfromdirectory (อิงกับไดเรกทอรี, basetype, pathurl, ไฟล์, ผลลัพธ์, typenames); } else {clazzpath = file.getAbsolutepath (). substring (achedirlen); clazzpath = clazzpath.replace ('//', '/'); dotypesfilter (basetype, pathurl, ผลลัพธ์, clazzpath, typenames); }}} / ** * @param basetype * @param pathurl * @param result * / public void listsubtypesfromjar (คลาสสุดท้าย <?> basetype, url pathurl, คอลเลกชันสุดท้าย <string> ผลลัพธ์สุดท้าย ... jarfile jarfile = null; ลอง {ถ้า ("ไฟล์" .Equals (pathurl.getProtocol ())) pathUrl = url ใหม่ ("jar:" + pathurl.toexternalform () + "!/"); jarfile = ((jarurlConnection) pathurl.openconnection ()). getjarfile (); } catch (ข้อยกเว้นสุดท้าย e) {สตริงสุดท้าย filepath = pathurl.getFile (); // ถ้าบนแพลตฟอร์ม win ถ้า (filepath.indexof (':')! = -1) {ถ้า (pathurl.getFile (). Charat (0) == '/') jarfile = new JarFile (filepath.substring (1)); } ถ้า (null == jarfile) jarfile = new JarFile (filePath); } การแจงนับสุดท้าย <jarentry> e = jarfile.entries (); รายการ Zipentry; ในขณะที่ (e.hasmoreElements ()) {entry = e.nextElement (); dotypesfilter (basetype, pathurl, ผลลัพธ์, entry.getName (), typenames); }} catch (สุดท้าย ioexception ioex) {}} โมฆะส่วนตัว dotypesfilter (คลาสสุดท้าย <?> basetype, pathurl URL สุดท้าย, คอลเลกชันสุดท้าย <string> ผลลัพธ์, สตริงสุดท้าย, สตริงสุดท้าย ... int สุดท้าย lastDotidx = clazzpath.AlastIndexof ('.'); if (-1 == lastDotidx) กลับ; สตริงสุดท้าย typedef = clazzpath.substring (0, lastDotidx). replace ('/', '.'); if (null! = typenames && typenames.length> 0) {สุดท้าย int lastDot = typedef.lastIndexof ('.'); if (lastdot == -1) return; สตริงสุดท้าย typename = typedef.substring (LastDot + 1); บูลีน withliked = false; สำหรับ (สตริงสุดท้าย tmptypename: typenames) {if (! typename.contains (tmptypename)) ดำเนินการต่อ; withliked = true; หยุดพัก; } ถ้า (withliked == false) return; } if (this.typefilters.isempty ()) {ถ้า (null == this.subtypefilter || this.subtypefilter.accept (basetype, pathurl, clazzpath)) result.add (typedef); } else {สำหรับ (final iTypefilter typeFilter: this.typefilters) {ถ้า (! typefilter.accept (clazzpath)) ดำเนินการต่อ; if (null == this.subtypefilter || this.subtypefilter.accept (basetype, pathurl, clazzpath)) result.add (typedef); }}} / ** * @param pathurl * @return * / บูลีนส่วนตัว AsconcePathurl (URL pathurl สุดท้าย) {ถ้า (this.PathurlFilters.isEmpty ()) คืนค่าจริง; สำหรับ (ขั้นสุดท้าย iPathurlFilter pathurlFilter: this.PathurlFilters) {ถ้า (pathurlfilter.accept (pathurl)) ส่งคืนจริง; } return false; -
แพ็คเกจ net.simple.reflect; นำเข้า java.beans.beans; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า java.io.unsupportencodingexception; นำเข้า java.net.jarurlconnection; นำเข้า Java.net.url; java.util.Collection; นำเข้า java.util.collections; นำเข้า java.util.enumeration; นำเข้า java.util.list; นำเข้า java.util.jar.jarentry นำเข้า java.util.jar.jarfile; net.simple.reflect.filter.samplesubinstancefilter; นำเข้า net.simple.reflect.filter.typefilter;/** * * @author li yanfei * @email [email protected] * 2 พฤศจิกายน 2016 ที่ 3:24:02 - สตริงสุดท้ายคงที่ var_end_flag = "}"; ภาพสะท้อนคงที่ส่วนตัว ShareDreflections; คอลเลกชันสุดท้ายคงที่ <String> EMP_COLL = Collections.empyList (); สาธารณะคงที่สุดท้ายเป็นโมฆะ createsharedrefletions (สตริงสุดท้าย ... filterexts) {การสะท้อนรอบสุดท้าย refs = การสะท้อนใหม่ (); refs.addpathurlfilter (ใหม่ pathurlfilter (filterexts)); // refs.addtypefilter (typefilter.default); refs.setsubtypefilter (SamplesubinstanceFilter.default); Reflectutils.setsharedrefletions (อ้างอิง); } /*** วิธีนี้ใช้เพื่อผูกเครื่องมือหมุนเวียนประเภทที่ใช้ร่วมกันทั่วไป * @param SharedReflections */ สาธารณะคงที่สุดท้ายเป็นโมฆะ setSharedReflections (การสะท้อนสุดท้าย SharedReflections) {ReflectUtils.sharedReflections = SharedReflections; } /*** ก่อนที่จะเรียกวิธีการนี้คุณต้องตั้งค่าเครื่องมือเส้นรอบวงประเภทที่ใช้ร่วมกันก่อน การอ้างอิง: {@link #SetSharedReflections (reflections)}, * วิธีนี้ส่วนใหญ่ทำให้สะดวกยิ่งขึ้นในการใช้คลาสที่กำหนด */ คอลเลกชันสุดท้ายคงที่ <String> LISTSUBCLASS (คลาสสุดท้าย <?> basetype, สตริงสุดท้าย ... typenames) // เนื่องจากการใช้งาน subclass ใหม่อาจถูกเพิ่มเข้ามาในขั้นตอนการโทรจึงจำเป็นต้องกู้คืนในแต่ละครั้ง เฉพาะเมื่อมีการเผยแพร่ผลิตภัณฑ์วิธีการบันทึกบันทึกจะใช้เพื่อปรับปรุงความเร็วในการเริ่มต้น return beans.isdesigntime ()? SharedReflections.getSubTypes (basetype, typenames): sharedreflections.getsubtypesfast (basetype); } รายการคงที่สาธารณะ <คลาส <? >> listclassofpackage (คลาสสุดท้าย <?> ctype, ส่วนขยายสตริงสุดท้าย) {รายการสุดท้าย <คลาส <? >> result = new ArrayList <คลาส <? >> (); รายการสุดท้าย <String> cPath = ReflectUtils.ListClassCanonicalNameOfPackage (ctype, ส่วนขยาย); สำหรับ (เส้นทางสตริงสุดท้าย: cPath) {ลอง {result.add (class.forName (พา ธ , เท็จ, tread.currentThread (). getContextClassLoader ())); } catch (ข้อยกเว้นสุดท้าย e) {// ละเว้น}} ผลการส่งคืน; } รายการคงที่สาธารณะ <String> listclasscanonicalnameofpackage (คลาสสุดท้าย <?> clazz, ส่วนขยายสตริงสุดท้าย) {return retchutils.listnameofpackage (clazz, ส่วนขยาย, จริง); } รายการคงที่สาธารณะ <String> listclassNameOfPackage (คลาสสุดท้าย <?> clazz, ส่วนขยายสตริงสุดท้าย) {return refiletUts.ListNameOfPackage (Clazz, Extension, False); } รายการคงที่สาธารณะ <String> listNameOfPackage (คลาสสุดท้าย <?> Clazz, ส่วนขยายสตริงสุดท้าย, บูลีนสุดท้าย fullpkgname) {return retchututils.listnameofpackage (clazz.getName () แทนที่ (',', '/') + ".class" } รายการคงที่สาธารณะ <String> listNameOfPackage (สตริงสุดท้าย clazzpkg, ส่วนขยายสตริงสุดท้าย, บูลีนสุดท้าย fullpkgname) {รายการสุดท้าย <string> result = new ArrayList <String> (); Final StringBuffer PKGBUF = ใหม่ StringBuffer (clazzpkg); if (pkgbuf.charat (0)! = '/') pkgbuf.insert (0, '/'); URL ขั้นสุดท้าย urlpath = rechlemutils.class.getResource (pkgbuf.toString ()); ถ้า (null == urlpath) ผลการส่งคืน; String checkedextenion = ส่วนขยาย; if (! expenion.endswith (". class")) checkedextenion = ส่วนขยาย + ".class"; if (pkgbuf.toString (). endswith (". class"))) pkgbuf.delete (pkgbuf.lastindexof ("/"), pkgbuf.length ()); pkgbuf.deletecharat (0); Final StringBuffer fileUrl = new StringBuffer (); ลอง {fileUrl.Append (urldecoder.decode (urlpath.toexternalform (), "UTF-8")); } catch (ขั้นสุดท้าย unsupportencodingexception e1) {fileUrl.Append (urlpath.toExternalform ()); } if (fileUrl.toString (). startswith ("ไฟล์:")) {fileUrl.delete (0, 5); // ลบไฟล์: Flag If (fileUrl.indexof (":")! = -1) fileUrl.deleTecharat (0); 8); Reflectutils.doListNameOfPackageIndirectory (ไฟล์ใหม่ (พื้นฐาน), ไฟล์ใหม่ (พื้นฐาน), ผลลัพธ์, pkgbuf.toString (), checkedextenion, fullpkgname); } else {Reflectutils.dolistNameOfPackageInjar (urlpath, urlpath, ผลลัพธ์, pkgbuf.toString (), checkedextenion, fullpkgname); } ผลตอบแทนผลลัพธ์; } / *** / โมฆะแบบคงที่ส่วนตัว DolistNameOfPackageInjar (URL ขั้นสุดท้าย baseUrl, URLPHATH ขั้นสุดท้าย, รายการสุดท้าย <String> ผลลัพธ์, สายสุดท้าย clazzpkg, ส่วนขยายสตริงสุดท้าย, บูลีนสุดท้าย fullpkgname) {ลอง {// มันไม่ทำงานกับไฟล์ ขั้นสุดท้าย JARURLCONNECTION CONN = (JARURLCONNECTION) urlPath.OpenConnection (); jarfile สุดท้าย jfile = conn.getjarfile (); การแจงนับสุดท้าย <Arentry> e = jfile.entries (); รายการ Zipentry; String entryName; ในขณะที่ (e.hasmoreElements ()) {entry = e.nextElement (); entryName = entry.getName (); if (entryName.startswith (clazzpkg) && entryName.endswith (extenion)) {ถ้า (fullpkgname) result.add (entryName.substring (0, entryName.AlastIndExof ('.')). แทนที่ (',')); else result.add (entryName.substring (entryName.lastIndexof ('/') + 1, entryName.AlastIndexof ('.'))); }}} catch (สุดท้าย ioexception ioex) {}} โมฆะคงที่ส่วนตัว dolistnameofpackageIndirectory (ไฟล์สุดท้ายที่ใช้ไดเรกทอรีไฟล์สุดท้าย, รายการสุดท้าย <String> ผลลัพธ์, สตริงสุดท้าย clazzpkg, ส่วนขยายสตริงสุดท้าย if (null == ไฟล์) ไฟล์ = ไฟล์ใหม่ [] {}; String Clazzpath; int basedirlen สุดท้าย = basedirectory.getabsolutepath (). ความยาว () + 1; สำหรับ (ไฟล์ไฟล์สุดท้าย: ไฟล์) {if (file.isdirectory ()) {rechortutils.doListNameOfPackageIndirectory (อิงกับไดเรกทอรี, ไฟล์, ผลลัพธ์, clazzpkg, ส่วนขยาย, fullpkgname); } else {ถ้า (! file.getName (). Endswith (extenion)) ดำเนินการต่อ; if (fullpkgname) {clazzpath = file.getAbsolutepath (). substring (achedirlen); clazzpath = clazzpath.substring (0, clazzpath.length () - 6); result.add (clazzpath.replace (file.separatorchar, '.')); } else {result.add (file.getName (). substring (0, file.getName (). length () - 6)); }}}} สาธารณะคงที่สุดท้าย <t> t initclass (สตริงสุดท้าย interclass, คลาสสุดท้าย <t> ttype) {return retchutils.initclass (interclass, ttype, true); } สาธารณะคงที่สุดท้าย <t> t initclass (สตริงสุดท้าย interclass, คลาสสุดท้าย <t> ttype, บูลีนสุดท้าย doinit) {ลอง {วัตถุวัตถุสุดท้าย = class.forname (interclass, doinit, thread.currentthread (). getContextClassLoader (). ส่งคืน ttype.cast (วัตถุ); } catch (final throwable e) {return null; -
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น