انعكاس Java المذكور هذه المرة ينطوي على الكثير من الكود. نظرًا لأن الانعكاس يستخدم غالبًا في العمل ، فقد صنعنا الكثير من التجريدات والمرشحات إلى الكود. على الرغم من أن الكود كبير ، إلا أنه بسيط وسهل الاستخدام ، كما أنه من السهل تعديل المكونات الإضافية للتصفية.
فيما يلي وصفًا لمكان استخدام الانعكاس في العمل. على سبيل المثال ، المكونات الإضافية أو المرشحات ، إذا كان هناك عدد أقل من الفئات الفرعية التجريدية ، فإن تكوينها إلى XML وغيرها من الهياكل يمكن أن تحقق نفس التأثير. إذا كنت تريد أن تكون أكثر مرونة ، فيمكنك استخدامه مباشرة بعد إضافة المكونات الإضافية أو الفئات الفرعية لتصفية رمز الرمز. قد يكون من الأفضل التفكير ، ويتم الحصول على جميع الفئات الفرعية الموروثة عن طريق مسح جميع ملفات الفصول أو JAR. إذا قمت بمسح جميع الملفات كل مكالمة ، فسيؤثر ذلك على الأداء. لذلك ، تتم إضافة ذاكرة التخزين المؤقت للانعكاس إلى التنفيذ لتخزين جميع نتائج الانعكاس كمفتاح لجميع المعلمات المشاركة في الحصول على الفئة الفرعية الانعكاس. إذا كان هذا هو المفتاح نفسه في المرة القادمة ، فلن تنسخ.
مثال الكود كما يلي:
Main Static Void Main (String [] args) {// قم بتعيين نطاق المسح ، والذي يمكن أن يكون موقع ملف الفئة ، مثل الموقع أسفل bin ، أو بداية mysql أو نهاية mysql ، // set "" لمسح جميع ، هذا ، هذا هو الوقت المستغرق للوقت ، الانعكاس. جرب {// يمكنك تعيين عمليات مسح كاملة في كل مرة في مرحلة التصحيح // beans.setDesignTime (true) ؛ المجموعة النهائية <String> الأنواع الفرعية = strenseUtils.liStubClass (ia.class) ؛ // لـ (النوع الفرعي للسلسلة النهائية: الأنواع الفرعية) {// ما تحصل عليه هنا هو system.out.println (النوع الفرعي) ؛ Final ia impl = respectUtils.initClass (النوع الفرعي ، ia.class) ؛ إذا (NULL == ضرائب) تستمر ؛ // من خلال هذه الطريقة ، يمكنك تنفيذ العمليات بطريقة موحدة ، Impl.print () ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }}نتيجة تنفيذ الكود:
. بشكل عام ، سيتم حذف الملف عندما تكون هناك فئات فرعية في الكود. Xmlutils.Readxml فشل: ./ configuration.ref (لا يمكن للنظام العثور على الملف المحدد.) net.simple.reflect.bnet.simple.reflect.test.simple.reflect.bnet.simple.reflect.test.dnet.simple.refer
للحصول على التفاصيل ، يرجى الاطلاع على الرمز المصدر. فيما يلي رموز الفئة الأساسية. عنوان رمز المصدر: https://git.oschina.net/eliyanfei/API_Tools
package net.simple.reflect ؛ import java.io.file ؛ import java.io.ioException ؛ import java.net.jarurlconnection ؛ import java.net.url ؛ import java.net.urldecoder ؛ import java.util.ArayLister ؛ java.util.linkedhashmap ؛ import java.util.list ؛ import java.util.map ؛ import java.util.concurrent.timeunit ؛ import java.util.jar.jarentry ؛ import java.util.jarfile net.simple.reflect.filter.ipathurlfilter ؛ استيراد net.simple.reflect.filter.isubtypefilter ؛ استيراد net.simple.reflect.filter.itypefilter [email protected] * 2 نوفمبر ، 2016 في 3:23:49 PM * */انعكاسات الفئة النهائية العامة {مجموعة خاصة نهائية <Url> pathurls ؛ المجموعة النهائية الخاصة <Ipathurlfilter> pathurlfilters ؛ المجموعة النهائية الخاصة <Typefilter> kypfilters ؛ خاص isubtypefilter نوع فرعي. انعكاسات عامة () {typefilters = new ArrayList <itypefilter> () ؛ PathurlFilters = new ArrayList <Ipathurlfilter> () ؛ this.pathurls = classPathhelper.getUrlsForCurrentClassPath () ؛ } الانعكاسات العامة (المجموعة النهائية <Url> pathurls) {this.pathurls = pathurls ؛ kyingfilters = new ArrayList <IpeFilter> () ؛ PathurlFilters = new ArrayList <Ipathurlfilter> () ؛ } / ** * param subtypefilter * النوع الفرعي لضبط * / public void setSubTypeFilter (Final IsubTypefilter subfilter) {this.subtypefilter = subtypefilter ؛ } / ** * @RETURN the Subtypefilter * / public isubtypefilter getSubTypeFilter () {return subtypefilter ؛ } الانعكاسات العامة AddPathurlFilter (Final ipathurlfilter pathurlfilter) {if (null == pathurlfilter) إرجاع هذا ؛ if (! this.pathurlfilters.contains (pathurlfilter)) this.pathurlfilters.add (pathurlfilter) ؛ إرجاع هذا ؛ } الانعكاسات العامة AddTyPefilter (نهائي itypefilter sypefilter) {if (null == kypefilter) إرجاع هذا ؛ if (! this.typefilters.contains (kypfilter)) this.typefilters.add (kypfilter) ؛ إرجاع هذا ؛ } static Final String private HistFile = "./Configuration.ref" ؛ الوثيقة الخاصة الوثيقة ؛ مجموعة عامة <string> getSubTypesFast (الفئة النهائية <؟> basetype) {// ، السلسلة النهائية ... typenames // First Filter Out المسار المسموح به حاليًا بفحص StringBuilder bufpathsid = new StringBuilder (32) ؛ الخريطة النهائية <file ، url> fileurls = new LinkedHashMap <file ، url> (8) ؛ لـ (url url النهائي: pathurls) {if (! قبول pathurl (pathurl)) متابعة ؛ ملف الملف = فارغ ؛ حاول {file = ملف جديد (urldecoder.decode (pathurl.getfile () ، "utf-8")) ؛ } catch (استثناء نهائي e) {file = ملف جديد (pathurl.getFile ()) ؛ } fileurls.put (ملف ، pathurl) ؛ if (! file.exists ()) // هل ملف url؟ تجاهل متابعة ؛ bufpathsid.append (file.getName ()). append (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 ()) ؛ element refele = w3cutils.firstchildElement (routele ، "e" ، "id" ، basetypeid) ؛ if (null! = refele) {Final List <Element> valueLes = W3Cutils.ChildElementList (refele ، "f") ؛ المجموعة النهائية <string> result = new ArrayList <String> (valueeles.size ()) ؛ لـ (element element falleele: valueeles) {result.add (سلسلة جديدة (base64.decodefast (valuele.getAttribute ("id"))))) ؛ } نتيجة الإرجاع ؛ } threadpool النهائي <listsubtypes> pool = new threadpool <listsubTypes> () ؛ لـ (FILE FILE FILEKEY: fileurls.keyset ()) {pool.execute (قوائم جديدة (basetype ، fileKey ، fileurls.get (fileKey))) ؛ } جرب {pool.shutdown (3 ، timeunit.minutes) ؛ } catch (Final interruptedException e) {E.PrintStackTrace () ؛ // for debug} collection final <string> result = new ArrayList <String> () ؛ لـ (listsubtypes النهائي المهمة: pool.getThReadRunables ()) {result.addall (task.result) ؛ } refele = w3cutils.addele (rootele ، "e") ؛ refele.setattribute ("id" ، basetypeid) ؛ لـ (سلسلة نهائية itm: result) {w3cutils.addele (refele ، "f"). setAttribute ("id" ، base64.encodetoString (itm.getBytes () ، false)) ؛ } جرب {w3cutils.writexmldocument (histfile ، histdom) ؛ } catch (استثناء نهائي e) {} نتيجة الإرجاع ؛ } / ** * see {link strenseUtils#createSharedReflections (سلسلة ...)}} * see {link strenseUtils#setSharedReflections (Reflections)} * see { @link referenceutils#listsubclass (class)} * paseype * / public collection String ... Typenames) {// Final ThreadPool <listsubTypes> pool = new threadpool <listsubTypes> () ؛ لـ (url url النهائي: pathurls) {if (! قبول pathurl (pathurl)) متابعة ؛ ملف الملف = فارغ ؛ حاول {file = ملف جديد (urldecoder.decode (pathurl.getfile () ، "utf-8")) ؛ } catch (استثناء نهائي e) {file = ملف جديد (pathurl.getFile ()) ؛ } pool.execute (قوائم جديدة (baseType ، ملف ، pathurl ، typenames)) ؛ } جرب {pool.shutdown (3 ، timeunit.minutes) ؛ } catch (Final interruptedException e) {E.PrintStackTrace () ؛ // for debug} collection final <string> result = new ArrayList <String> () ؛ لـ (listsubtypes النهائي المهمة: pool.getThReadRunables ()) {result.addall (task.result) ؛ } نتيجة الإرجاع ؛ } class sistsubtypes تنفذ Runnable {Final File File ؛ الفئة النهائية <؟> basetype ؛ عنوان URL النهائي Pathurl ؛ السلسلة النهائية [] Typenames ؛ Public ListsubTypes (الفئة النهائية <؟> basetype ، ملف الملف النهائي ، url url النهائي ، السلسلة النهائية ... typenames) {this.basetype = basetype ؛ this.file = ملف ؛ this.pathurl = pathurl ؛ this.typenames = typenames ؛ } Collection <String> result = new ArrayList <String> (4) ؛ Override public void run () {if (file.isdirectory ()) {listsubTypesFromDirectory (ملف ، basetype ، pathurl ، ملف ، نتيجة ، typenames) ؛ } else sistsubtypesfromjar (baseType ، pathurl ، result ، typenames) ؛ }} / ** * param basetype * param pathurl * param result * / public void listsubtypesfromdirectory (final file filedirectory ، class final class <؟> baseType ، url url pathurl ، final file directory ، final collem if (null == files) ملفات = ملف جديد [] {} ؛ سلسلة Clazzpath Final int reflirlen = riptiredirectory.getabsolutepath (). length () + 1 ؛ لـ (ملف الملف النهائي: الملفات) {if (file.isdirectory ()) {listsubTypesFromDirectory (riptiredirectory ، basetype ، pathurl ، file ، result ، typenames) ؛ } آخر {clazzpath = file.getabsolutepath (). substring (على أساس) ؛ clazzpath = clazzpath.replace ('//' ، '/') ؛ dotypesfilter (basetype ، pathurl ، النتيجة ، clazzpath ، typenames) ؛ }}} / ** * param basetype * param pathurl * param result * / public void listsubtypesfromjar (الفئة النهائية <؟> basetype ، url pathurl ، المجموعة النهائية <string> النتيجة ، السلسلة النهائية ... typenames) {try {// لا تعمل مع ملفات الملفات: Jarfile Jarfile = null ؛ جرب {if ("file" .equals (pathurl.getProtocol ())) pathurl = url جديد ("jar:" + pathurl.toexternalform () + "!/") ؛ jarfile = ((jarurlConnection) pathurl.openconnection ()). getJarfile () ؛ } catch (استثناء نهائي e) {Final String filePath = pathurl.getFile () ؛ // if on win platform if (filepath.indexof (':')! = -1) {if (pathurl.getFile (). charat (0) == '/') jarfile = new jarfile (filepath.substring (1)) ؛ } if (null == jarfile) jarfile = new jarfile (filepath) ؛ } التعداد النهائي <jarentry> e = jarfile.entries () ؛ دخول Zipentry ؛ بينما (e.hasmoreElements ()) {interv = e.NextElement () ؛ dotypesfilter (basetype ، pathurl ، result ، enter.getName () ، typenames) ؛ }} catch (Final ioException ioex) {}} private void dypysfilter (الفئة النهائية <؟> basetype ، url url النهائي ، المجموعة النهائية <string> النتيجة ، السلسلة النهائية clazzpath ، السلسلة النهائية ... typenames) {if (! Final int lastDotidx = clazzpath.lastindexof ('.') ؛ if (-1 == lastDotidx) العودة ؛ السلسلة النهائية typedef = clazzpath.substring (0 ، lastDotidx) .replace ('/' ، '.') ؛ if (null! = typenames && typenames.length> 0) {Final int lastDot = typedef.lastindexof ('.') ؛ if (lastDot == -1) return ؛ سلسلة typename = typedef.substring (LastDot + 1) ؛ boolean withliked = false ؛ لـ (السلسلة النهائية tmptypename: typenames) {if (! typename.contains (tmptypename)) متابعة ؛ withliked = صحيح ؛ استراحة؛ } if (withliked == false) return ؛ } if (this.typefilters.isempty ()) {if (null == this.subtypefilter || this.subtypefilter.accept (basetype ، pathurl ، clazzpath)) result.add (typedef) ؛ } else {for (final ItyPefilter sypefilter: this.typefilters) {if (! kyingfilter.accept (clazzpath)) متابعة ؛ if (null == this.subtypefilter || this.subtypefilter.accept (basetype ، pathurl ، clazzpath)) result.add (typedef) ؛ }}} / ** * param pathurl * return * / private boolean قبول pathurl (url url النهائي) {if (this.pathurlfilters.isempty ()) إرجاع true ؛ لـ (Final ipathurlfilter pathurlfilter: this.pathurlfilters) {if (pathurlfilter.accept (pathurl)) return true ؛ } إرجاع خطأ ؛ }}
package net.simple.reflect ؛ استيراد java.beans.beans ؛ استيراد java.io java.util.collection ؛ استيراد java.util.collections ؛ استيراد java.util.enumeration ؛ استيراد java.util.list ؛ استيراد java.util.jar.jarentry ؛ استيراد java.til.jar.jarfile net.simple.reflect.filter.samplesUbinstanceFilter ؛ import net.simple.reflect.filter.typefilter ؛/** * * * @Author li yanfei * @email [email protected] * نوفمبر 2 ، 2016 في 3:24:02 مساءً *//عام. "$ {" ؛ السلسلة النهائية الثابتة العامة var_end_flag = "}" ؛ انعكاسات ثابتة خاصة مشتركة. المجموعة النهائية الثابتة <string> emp_coll = collections.emptylist () ؛ public static final void createSharedReplections (السلسلة النهائية ... filterexts) {Reference Final Refs = New Reflections () ؛ refs.addpathurlfilter (new PathurlFilter (filterexts)) ؛ // refs.addtypefilter (kypefilter.default) ؛ refs.setsubtypefilter (samplesubinstanceFilter.default) ؛ strenseutils.setsharedreflections (Refs) ؛ } /*** يتم استخدام هذه الطريقة لربط أداة تداول نوع مشترك مشترك. * param serventreflections */ public static final void setsharedreflections (الانعكاسات النهائية المشتركة) {respectUtils.sharedReflections = sharedReflections ؛ } /*** قبل استدعاء هذه الطريقة ، يجب عليك أولاً تعيين أداة محيطية النوع المشترك. المرجع: {link #SetSharedReflections (Reflections)} ، * هذه الطريقة تجعلها أكثر ملاءمة لتنفيذ الفئة المعطاة ، */ المجموعة النهائية الثابتة العامة <string> listsubclass (الفئة النهائية <؟> basetype ، السلسلة النهائية ... typenames) {// if (null == sharedRefections) return emp_coll ؛ // نظرًا لأنه يمكن إضافة تطبيقات الفئة الفرعية الجديدة في مرحلة الاتصال ، فمن الضروري أن تنقذ في كل مرة. فقط عند نشر المنتج ، يتم استخدام طريقة حفظ السجلات لتحسين سرعة بدء التشغيل. إرجاع beans.isdesigntime ()؟ sharedReflections.getSubTypes (baseType ، typenames): sharedReflections.getSubTypesfast (basetype) ؛ } القائمة الثابتة العامة <class <؟ >> listClassofPackage (الفئة النهائية <؟> ctype ، امتداد السلسلة النهائية) {القائمة النهائية <؟ >> result = new ArrayList <class <؟ >> () ؛ القائمة النهائية <String> cPath = ReflectUtils.ListClassCanonicalNameOfPackage (ctype ، extension) ؛ لـ (مسار السلسلة النهائية: CPATH) {try {result.add (class.forname (path ، false ، thread.currentThRead (). getContextClassLoader ())) ؛ } catch (استثناء نهائي e) {// تجاهل}} نتيجة الإرجاع ؛ } القائمة الثابتة العامة <string> listClassCanonicalNameOfPackage (الفئة النهائية <؟> clazz ، امتداد السلسلة النهائية) {return supervils.listNameOfPackage (clazz ، extension ، true) ؛ } القائمة الثابتة العامة <string> listClassNameOfPackage (الفئة النهائية <؟> clazz ، امتداد السلسلة النهائية) {return supervils.listNameOfPackage (clazz ، extension ، false) ؛ } القائمة الثابتة العامة <string> listNameOfPackage (الفئة النهائية <؟> clazz ، امتداد السلسلة النهائية ، fullpkgname النهائي) {return respectUtils.ListNameOfPackage (clazz.getname (). استبدال ('.' ، '/') } القائمة الثابتة العامة <string> listNameOfPackage (السلسلة النهائية clazzpkg ، امتداد السلسلة النهائية ، fullpkgname النهائي) {قائمة نهائية <String> result = new ArrayList <String> () ؛ Final StringBuffer PKGBUF = New StringBuffer (clazzpkg) ؛ if (pkgbuf.charat (0)! = '/') pkgbuf.insert (0 ، '/') ؛ URL urlpath النهائي = الانعكاس. إذا (null == urlpath) نتيجة العودة ؛ سلسلة checkedExtenion = التمديد ؛ if (! extenion.endswith (". if (pkgbuf.toString (). endswith (". pkgbuf.deletecharat (0) ؛ Final StringBuffer fileurl = new StringBuffer () ؛ حاول {fileurl.append (urldecoder.decode (urlpath.toexternalform () ، "utf-8")) ؛ } catch (Final UnsupportEdenCodingException E1) {fileurl.append (urlPath.ToExternalForm ()) ؛ } if (fileurl.toString (). startswith ("file:")) {fileurl.delete (0 ، 5) ؛ // delete file: flag if (fileurl.indexof (":")! = -1) fileurl.dealtecharat (0) ؛ 8) ؛ ReflectUtils.DolistNameOfPackAgeIndirectory (ملف جديد (مستند) ، ملف جديد (قائم) ، النتيجة ، pkgbuf.toString () ، checkedExtenion ، FullPkgname) ؛ } آخر {strenseUtils.dolistNameOfPackageInjar (urlpath ، urlpath ، result ، pkgbuf.toString () ، checkedExtenion ، fullPkgname) ؛ } نتيجة الإرجاع ؛ } / *** / private static void dolistnameofpackageInjar (url baseurl النهائي ، url urlpath النهائي ، القائمة النهائية <string> النتيجة ، السلسلة النهائية clazzpkg ، امتداد السلسلة النهائية ، Final Boolean FullPkgname) {try {// لا يعمل مع ملفات الملفات: نهائي jarurlConnection conn = (jarurlConnection) urlpath.openconnection () ؛ jarfile jfile النهائي = conn.getjarfile () ؛ التعداد النهائي <Garentry> e = jfile.entries () ؛ دخول Zipentry ؛ سلسلة إدخال ؛ بينما (e.hasmoreElements ()) {interv = e.NextElement () ؛ intplyName = intrad.getName () ؛ if (entrateName.StartSwith (clazzpkg) && internname.endswith (extenion)) {if (fullpkgname) result.add (intradName.SubString (0 ، intradname.lastindexof ('.'). استبدال ('/' ، '.')) ؛ Else Result.Add (intradName.SubString (intradName.lastIndexof ('/') + 1 ، internname.lastindexof ('.'))) ؛ }}} catch (Final ioException ioex) {}} private static void dolistnameofpackageIndirectory (final file filedirectory ، دليل الملف النهائي ، القائمة النهائية <string> النتيجة ، سلسلة السلسلة النهائية clazzpkg ، امتداد السلسلة النهائية ، fullpkgname) if (null == files) ملفات = ملف جديد [] {} ؛ سلسلة Clazzpath Final int reflirlen = riptiredirectory.getabsolutepath (). length () + 1 ؛ لـ (ملف الملف النهائي: الملفات) {if (file.isdirectory ()) {strenseUtils.dolistNameOfPackAgeIndIrectory (riptiredirectory ، file ، result ، clazzpkg ، extension ، fullpkgname) ؛ } آخر {if (! file.getName (). endswith (extenion)) متابعة ؛ if (fullPkgname) {clazzpath = file.getabsolutepath (). substring (على أساس) ؛ clazzpath = clazzpath.substring (0 ، clazzpath.length () - 6) ؛ result.add (clazzpath.replace (file.separatorchar ، '.')) ؛ } آخر {result.add (file.getName (). substring (0 ، file.getName (). length () - 6)) ؛ }}}} النهائي الثابت العام <T> t initClass (السلسلة النهائية المصغرة ، الفئة النهائية <T> ttype) {return supervils.initClass (Implclass ، ttype ، true) ؛ } Final Static Final <T> t initClass (السلسلة النهائية المصغرة ، الفئة النهائية <T> ttype ، النهائي boolean doinit) {try {final object object = class.forname (inplclass ، doinit ، thread.currentThread (). getContextClassLoader ()). إرجاع ttype.cast (كائن) ؛ } catch (نهائي رمي e) {return null ؛ }}}
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.