Отражение Java упомянуто на этот раз, включает в себя много кода. Поскольку отражение часто используется в работе, мы сделали много абстракций и фильтров в код. Хотя код большой, он прост и прост в использовании, а плагины фильтрования также легко изменять.
Ниже приведено описание того, где отражение легче использовать в работе. Например, плагины или фильтры, если меньше абстрактных подклассов, их настройка на XML и другие структуры также может достичь того же эффекта. Если вы хотите быть более гибким, вы можете использовать его непосредственно после добавления подклассов плагинов или кода фильтрации. Может быть лучше отражать, и все наследственные подклассы получают путем сканирования всех файлов класса или JAR. Если вы сканируете все файлы каждый вызов, это повлияет на производительность. Следовательно, кеш отражения добавляется к реализации, чтобы кэшировать все результаты отражения в качестве ключа для всех параметров, связанных с получением подкласса отражения. Если в следующий раз это тот же ключ, вы не откроете.
Пример кода заключается в следующем:
public static void main (string [] args) {// установить диапазон сканирования, который может быть местоположением файла класса, такого как местоположение под корпусом или начало MySQL или конец MySQL, // установить «для сканирования всех, это затраты на время, MERTERUTILS.CREATESHARELECES (« классы », BIN», MySQL); Попробуйте {// Вы можете устанавливать полные сканирования каждый раз на этапе отладки // beans.setDesigntime (true); Окончательная коллекция <string> subtypes = RefletutuTils.listsubclass (ia.class); // for (final string subtype: subtypes) {// что вы получаете здесь System.out.println (subtype); final ia Impl = Refertutils.InitClass (subtype, ia.class); if (null == Impl) продолжить; // Через этот метод вы можете выполнять операции единым образом, Impl.print (); }} catch (Exception e) {e.printstackTrace (); }}Результат выполнения кода:
// кэшируйте файл, чтобы избежать повреждения каждый раз, когда размышляет // Если вы удалите файл, он будет спасен, когда отражение снова будет вызвано. Как правило, файл будет удален, когда в коде есть подклассы. Xmlutils.readxml сбой: ./ configuration.ref (система не может найти указанный файл.) Net.simple.reflect.test.bnet.simple.reflect.test.bnet.simple.reflect.test.bnet.simple.reflect.test.dnet.simple.reflet.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; import java.util.arraylist; import java.ut.collection; импорт; импорт; импорт; java.util.linkedhashmap; import java.util.list; import java.util.map; import java.util.concurrent.timeUnit; импорт java.util.jar.jarentry; импорт java.util.jar.jarfile; импорт java.zip.zipentry; net.simple.reflect.filter.ipathurlfilter; import net.simple.reflect.filter.isubtypefilter; import net.simple.reflect.filter.itypefilter; импорт org.w3c.dom.document; импорт org.w3c.dom.element;/***************** [email protected] * 2 ноября 2016 г. в 15:23:49 * */Public Final Class Refuctions {Private Final Collection <url> Pathurls; Частная финальная коллекция <ipathurlfilter> pathurlfilters; Частная финальная коллекция <itypefilter> Typerfilters; частный IsubtyPefilter subtypefilter; public Refluections () {typefilters = new ArrayList <itypefilter> (); pathurlfilters = new ArrayList <pathurlfilter> (); this.pathurls = classpathhelper.geturlsforcurrentclasspath (); } public Reflections (окончательная коллекция <url> pathurls) {this.pathurls = pathurls; typefilters = new ArrayList <itypefilter> (); pathurlfilters = new ArrayList <pathurlfilter> (); } / ** * @param subtypefilter * subtypefilter для установки * / public void setsubtypefilter (final Isubtypifilter subtypefilter) {this.subtypefilter = subtypefilter; } / **! } public Reflections addpathurlfilter (final ipathurlfilter patherlfilter) {if (null == patherlfilter) вернуть это; if (! this.pathurlfilters.contains (pathurlfilter)) this.pathurlfilters.add (pathurlfilter); вернуть это; } public Reflections AddTyPefilter (final ItyPefilter TypeFilter) {if (null == typefilter) вернуть это; if (! this.typefilters.contains (typefilter)) this.typefilters.add (typefilter); вернуть это; } частная статическая конечная строка histfile = "./configuration.ref"; частный документ Histdom; Public Collection <String> getSubTypesFast (Final Class <?> BASETYPE) {//, Final String ... TypeNames // Первый отфильтрой, который в настоящее время может сканировать Final StringBuilder BUFPATHSID = new StringBuilder (32); окончательная карта <файл, url> fileUrls = new LinkedHashmap <file, url> (8); for (final URL Pathurl: Pathurls) {if (! accectPathurl (phathurl)) продолжить; File file = null; try {file = new file (urldecoder.decode (pathurl.getfile (), "utf-8")); } catch (окончательное исключение e) {file = new File (pathurl.getFile ()); } fileUrls.put (file, pathurl); if (! file.exists ()) // Является ли URL -файл? Игнорировать продолжение; bufpathsid.append (file.getName ()). Append (file.lastmodified ()); } final String domid = md5.gethashString (bufpathsid.tostring ()); if (null == histdom) hisdom = w3cutils.readxml (histfile); if (null == histdom) hisdom = w3cutils.newdom ("r"); Letle roote = histdom.getDocumentelement (); if (null == rootele) histdom.appendchild (rootle = histdom.createElement ("r")); if (! domid.equals (rootle.getattribute ("id"))) {rootele.getParentNode (). removeChild (rootele); histdom.appendchild (rootle = histdom.createElement ("r")); rootle.setattribute ("id", domid); } final String basetypeid = md5.gethashString (basetype.getName ()); Element refele = w3cutils.firstchildElement (Rootele, "e", "id", Basetypeid); if (null! = refele) {окончательный список <element> valueEles = w3cutils.childElementlist (refele, "f"); Окончательная коллекция <string> result = new ArrayList <string> (valueEles.size ()); for (конечный элемент valueEle: valueEles) {result.add (new String (base64.decodefast (valueEle.getAttribute ("id")))); } return Result; } final ThreadPool <sistSubtyPes> pool = new ThreadPool <ListSubtyPes> (); для (окончательный файл файла: fileurls.keyset ()) {pool.execute (new ListSubtypes (baseType, fileKey, fileUrls.get (fileKey))); } try {pool.shutdown (3, timeUnit.minutes); } catch (final urruptedException e) {e.printstackTrace (); // для отладки} final Collection <string> result = result = new ArrayList <string> (); для (final listSubtypes задача: pool.getThreadRunables ()) {result.addall (task.result); } refele = w3cutils.addele (rootle, "e"); refele.setattribute ("id", basetypeid); for (final String itm: result) {w3cutils.addele (refele, "f"). setattribute ("id", base64.encodetoString (itm.getbytes (), false)); } try {w3cutils.writexmldocument (histfile, histdom); } catch (окончательное исключение e) {} return result; } / ** * @see {@link erferreatutils#createshareReflections (string ...)} * @see {@link referreututils#setshareReflace (Reflections)} * @see {@link enterulituutils#listsubclass (class)} * @param basetype * @return * / public Collection <string> getSeube (final> final (finally> finalpe (finally <? String ... typeNames) {// final ThreadPool <ListSubtyPes> pool = new ThreadPool <ListSubtyPes> (); for (final URL Pathurl: Pathurls) {if (! accectPathurl (phathurl)) продолжить; File file = null; try {file = new file (urldecoder.decode (pathurl.getfile (), "utf-8")); } catch (окончательное исключение e) {file = new File (pathurl.getFile ()); } pool.execute (new ListSubtypes (Basetype, File, Pathurl, Typenames)); } try {pool.shutdown (3, timeUnit.minutes); } catch (final urruptedException e) {e.printstackTrace (); // для отладки} final Collection <string> result = result = new ArrayList <string> (); для (final listSubtypes задача: pool.getThreadRunables ()) {result.addall (task.result); } return Result; } класс ListSubtypes реализует runnable {final файл файла; окончательный класс <?> Basetype; окончательный URL Pathurl; final String [] typenames; publicStSubtyPes (окончательный класс <?> Basetype, окончательный файл файла, окончательный pathurl URL, окончательная строка ... typenames) {this.basetype = basetype; this.file = file; this.pathurl = pathurl; this.typenames = typenames; } Collection <string> result = new ArrayList <string> (4); @Override public void run () {if (file.isdirectory ()) {listSubtypesFromDirectory (file, basetype, pathurl, file, result, typeNames); } else ListSUBTYPESFROMJAR (BASETYPE, PATHURL, RELUT, TypenAmes); }} / ** * @param basetype * @param pathurl * @param result * / public void listsubtypesfromDirectory (окончательный файл на основе, окончательный класс <?> Basetype, окончательный Pathurl, окончательный файл, окончательный сбор <String> Result, Final String ... typeNames) {file [] files = Directory if (null == files) files = new File [] {}; String clazzpath; final int basedirlen = basedirectory.getabsolutePath (). Length () + 1; для (окончательный файл файла: files) {if (file.isdirectory ()) {listSubtypesFromDirectory (baseRectory, basetype, pathurl, file, result, typeNames); } else {clazzpath = file.getabsolutepath (). substring (basedirlen); clazzpath = clazzpath.replace ('//', '/'); DotyphesFilter (Basetype, Pathurl, Result, Clazzpath, Typenames); } } } /** * @param baseType * @param pathUrl * @param result */ public void listSubTypesFromJar(final Class<?> baseType, URL pathUrl, final Collection<String> result, final String... typeNames) { try { // It does not work with the filesystem: we must // be in the case of a package contained in a jar file. Jarfile jarfile = null; try {if ("file" .equals (pathurl.getProtocol ())) pathurl = new URL ("jar:" + pathurl.toexternalform () + "!/"); jarfile = ((jarurlconnection) pathurl.openconcenection ()). getJarfile (); } catch (окончательное исключение e) {final String filePath = pathurl.getFile (); // Если на 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; while (e.hasmoreelements ()) {intry = e.nextelement (); dotyphesfilter (basetype, pathurl, result, entry.getname (), typenames); }} catch (final ioException ioex) {}} private void dotyphesFilter (final class <?> Basetype, Final URL Pathurl, Final Collection <string> Результат, окончательная строка Clazzpath, Final String ... typenames) {if (! clazzpath.endswith (". Class")) return; final int lastdotidx = clazzpath.lastindexof ('.'); if (-1 == lastdotidx) return; final String typedef = clazzpath.substring (0, lastdotidx) .replace ('/', '.'); if (null! = typeNames && typeNames.length> 0) {final int fastdot = typedef.lastIndexof ('.'); if (lastdot == -1) return; final String typename = typedef.substring (Lastdot + 1); логический сдержанный = false; for (final String tmptypeName: typeNames) {if (! typename.contains (tmptypeName))) продолжить; withliked = true; перерыв; } 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 typefilter: this.typefilters) {if (! typefilter.accept (clazzpath)) продолжить; if (null == this.subtypefilter || this.subtypefilter.accept (basetype, pathurl, clazzpath)) result.add (typedef); }}} / ** * @param pathurl * @return * / private boolean accectpathurl (final pathurl) {if (this.pathurlfilters.isempty ()) return true; для (окончательный pathurlfilter: this.pathurlfilters) {if (pathurlfilter.accept (phathurl)) вернуть true; } вернуть false; }}
пакет net.simple.reflect; импорт java.beans.beans; import java.io.file; импорт java.io.ioexception; импорт java.io.unsupportedencodingexception; импорт java.net.jarurlconection; import java.net.url; импорт java.net.net. java.util.collection; импорт java.util.collections; импорт java.util.enumeration; импорт java.util.list; import java.util.jar.jarentry; импорт java.util.jar.jarfile; импорт java.util.zip.zipentry; net.simple.reflect.filter.samplesubinstancefilter; import net.simple.reflect.filter.typefilter;/** * * @author li Yanfei * @email [email protected] * 2 ноября 2016 г. в 3:24:02 PM */Public Final Class werturetils {public Static static static_straG_STARG_STAG_STAG_STRAG_STRAG_STRAG_STRAG_STAG "$ {"; Общественная статическая конечная строка var_end_flag = "}"; частные статические размышления SharedReflections; Статическая окончательная коллекция <string> emp_coll = collections.emptylist (); public static final void createsharedReflace (final String ... FilterExts) {Окончательные отражения refs = new Refluections (); refs.addpathurlfilter (new Pathurlfilter (filterExts)); // refs.addtypefilter (typefilter.default); refs.setsubtypefilter (samplesubinstancefilter.default); Reflectutils.setshareReflace (Refs); } /*** Этот метод используется для привязки общего инструмента циркуляции общего типа. * @param sharedreflections */ public static final void setsharedreflace (окончательные размышления SharedReflections) {Refertutils.sharedReflections = sharedReflections; } /*** Перед вызовом этого метода вы должны сначала установить инструмент по окружению общего типа. Ссылка: {@Link #SetShareReflections (Reflections)}, * Этот метод в основном делает более удобным для реализации данного класса, */ public Static Final Collection <string> listSubClass (окончательный класс <?> BaseType, Final String ... Typenames) {// if (null == sharedreflects) return emp_coll; // Поскольку новые реализации подкласса могут быть добавлены на этапе вызова, необходимо каждый раз отменять. Только когда продукт опубликован, метод сохранения записей используется для улучшения скорости запуска. return beans.isdesigntime ()? sharedreflections.getsubtypes (basetype, typenames): sharedreflections.getsubtypesfast (basetype); } public Static List <Class <? >> listClassOfPackage (окончательный класс <?> ctype, final String Extension) {final List <? >> result = new ArrayList <class <? >> (); Окончательный список <string> cpath = Refertutils.listclasscanonicalNameOfPackage (ctype, Extension); for (final String Path: cpath) {try {result.add (class.forname (path, false, thread.currentThread (). getContextClassloader ())); } catch (окончательное исключение e) {// Игнорировать}} return Result; } public Static List <string> ListClassCanonicalNameOfPackage (Final Class <?> Clazz, Final String Extension) {return urertuTiltils.listnameofPackage (clazz, endension, true); } public Static List <string> listClassNameOfPackage (Final Class <?> Clazz, Final String Extension) {return urertutuTils.listnameofPackage (clazz, endension, false); } public Static List <string> ListNameOfPackage (Final Class <?> Clazz, Final String Extension, Final Boolean Fullpkgname) {return erferreatutils.listnameofpackage (clazz.getName (). reply ('.', '/') + ".class", Extension, fullpkgname); } public Static List <string> listNameOfPackage (окончательная строка Clazzpkg, Final String Extension, Final Boolean Fullpkgname) {final List <string> result = new ArrayList <string> (); Final StringBuffer pkgbuf = new StringBuffer (clazzpkg); if (pkgbuf.charat (0)! = '/') pkgbuf.insert (0, '/'); Окончательный URL urlpath = Refertutils.class.getResource (pkgbuf.tostring ()); if (null == urlpath) вернуть результат; String CheckEdextenion = extension; if (! exttenion.endswith (". Class")) CheckedExtenion = extension + ".class"; if (pkgbuf.tostring (). Endswith (". Class"))) pkgbuf.delete (pkgbuf.lastiDexof ("/"), pkgbuf.length ()); pkgbuf.deletecharat (0); final StringBuffer fileUrl = new StringBuffer (); try {fileUrl.append (urldecoder.decode (urlpath.toexternalform (), "utf-8")); } catch (final unsupportEncodingexception e1) {fileUrl.append (urlpath.toexternalform ()); } if (fileUrl.toString().startsWith("file:")) { fileUrl.delete(0, 5);// delete file: flag if (fileUrl.indexOf(":") != -1) fileUrl.deleteCharAt(0);// delete flag final String baseDir = fileUrl.substring(0, fileUrl.lastIndexOf("classes") + 8); RefertUtilils.dolistnameofpackageIndirectory (новый файл (на основе), новый файл (на основе), результат, pkgbuf.tostring (), ceckedextenion, fullpkgname); } else {Refertutils.dolistnameofpackageinjar (urlpath, urlpath, result, pkgbuf.tostring (), checkedextenion, fullpkgname); } return Result; } / *** / private static void dolistnameofpackageinjar (final url baseurl, окончательный URL Urlpath, Final List <string> Результат, окончательная строка Clazzpkg, окончательный расширение строки, окончательный логический логический окончательный jarurlConnection conn = (jarurlConnection) urlpath.openconcection (); final jarfile jfile = conn.getJarfile (); окончательное перечисление <jarentry> e = jfile.entries (); Вход на Zipentry; String rentname; while (e.hasmoreelements ()) {intry = e.nextelement (); intryName = entry.getName (); if (inpitname.startswith (clazzpkg) && intryname.endswith (extenion)) {if (fullpkgname) result.add (intrentname.substring (0, rentname.lastIndexof ('.')). Заменить ('/', ')); else result.add (intrentname.substring (inpitname.lastindexof ('/') + 1, inpitname.lastindexof ('.'))); }}} catch (final ioexception ioex) {}} private static void dolistnameOfPackageIndirectory (окончательный файл на основе файла, окончательный каталог файлов, окончательный список <string> результат, окончательная строка clazzpkg, окончательный расширение строки, окончательный boolean fullpkgname) {file [] files = jormethory.listory.listfiles ();); if (null == files) files = new File [] {}; String clazzpath; final int basedirlen = basedirectory.getabsolutePath (). Length () + 1; для (окончательный файл файла: files) {if (file.isdirectory ()) {Refertutils.dolistnameofpackageIndirectory (основанный на основе, файл, результат, clazzpkg, endension, fullpkgname); } else {if (! file.getName (). Endswith (Exttenion)) продолжить; if (fullpkgname) {clazzpath = file.getabsolutepath (). substring (основанный на основе); clazzpath = clazzpath.substring (0, clazzpath.length () - 6); result.add (clazzpath.replace (file.separatorch, '.')); } else {result.add (file.getName (). substring (0, file.getName (). Length () - 6)); }}}} public static final <T> t initClass (Final String Implcass, Final Class <t> ttype) {return erferretutils.intclass (Implclass, ttype, true); } public static final <T> t initClass (окончательная строка Implcss, окончательный класс <t> ttype, final boolean doInit) {try {final object object = class.forname (Implclass, doInit, thread.currentThread (). getContextClassLoader ()). NewInStance (); вернуть ttype.cast (Object); } catch (final Throwable E) {return null; }}}
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.