今回言及されたJavaの反射には、多くのコードが含まれます。反射は仕事でよく使用されるため、コードに多くの抽象化とフィルターを作成しました。コードは大きいですが、シンプルで使いやすく、フィルタープラグインも簡単に変更できます。
以下は、リフレクションが仕事で使いやすい場所の説明です。たとえば、プラグインまたはフィルターは、抽象サブクラスが少ない場合、それらをXMLに構成し、他の構造も同じ効果を達成できます。より柔軟になりたい場合は、プラグインまたはフィルターコードサブクラスを追加した後、直接使用できます。反映する方が良いかもしれませんし、すべてのクラスファイルまたはJARファイルをスキャンすることで、継承されたすべてのサブクラスが取得されます。呼び出しごとにすべてのファイルをスキャンすると、パフォーマンスに影響します。したがって、リフレクションキャッシュが実装に追加され、反射サブクラスの取得に関与するすべてのパラメーターのキーとしてすべての反射結果をキャッシュします。次回同じキーである場合、再実行しません。
コードの例は次のとおりです。
public static void main(string [] args){//スキャン範囲を設定します。スキャン範囲は、ビンの下の場所、mysqlの開始、// set "" "" "" bin "、" bin "、" bin "、" bin "、" bin "、" bin "、" bin "、" bin "、" bin "、" bin "、" bin "、" bin "、" "、mysqlの終わりなど、クラスファイルの位置を設定します。 try {//デバッグ段階で毎回完全なスキャンを設定できます// beans.setdesigntime(true);最終的なコレクション<string> subtypes = reflectutils.listubclass(ia.class); // for(final string subtype:subtypes){//ここで入手するのはsystem.out.println(subtype);最終的なia empl = reflectutils.initclass(subtype、ia.class); if(null == empl)継続; //この方法を介して、統一された方法で操作を実行できます。 }} catch(例外e){e.printstacktrace(); }}コード実行結果:
//リフレクションが呼び出されるたびに再実行を避けるためにファイルをキャッシュ//ファイルを削除すると、反射が再び呼び出されると再実行されます。通常、コードにサブクラスがあるときにファイルは削除されます。 xmlutils.readxml障害:./ configuration.ref(システムは指定されたファイルを見つけることができません。)net.simple.reft.test.bnet.simple.test.bnet.simple.reflect.test.bnet.simple.reflect.test.test.dnet.simple.reff.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.refl.le
詳細については、ソースコードを参照してください。 2つのコアクラスコードを次に示します。ソースコードアドレス:https://git.oschina.net/eliyanfei/api_tools
パッケージ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.arraylist; Import java.util.util.util.util.til.util.util.util.util.colection; java.util.linkedhashmap; import java.util.list; import java.util.map; import java.util.concurrent.timeunit; import java.util.jarentry; import java.util.jar.jarfile; import java.util.zip.zipentry; net.simple.Reflect.filter.ipathurlfilter; Import net.simple.reflt.filter.isubtypefilter; Import net.simple.reflt.filter.itypefilter; Import org.w3c.dom.document; import org.w3c.domement; [email protected] * 2016年11月2日午後3時23分49 pm * */パブリックファイナルクラスリフレクション{プライベートファイナルコレクション<url> pathurls;プライベートファイナルコレクション<IPaturlFilter> pathurlfilters;プライベートファイナルコレクション<ITYPEFILTER> TYPTFILTERS; Private Isubtypefilter Subtypefilter; public Reflections(){typefilters = new ArrayList <ItyPefilter>(); paturlfilters = new ArrayList <Ipaturlfilter>(); this.paturls = classpathelper.geturlsforcurrentclasspath(); } public Reflections(final collection <url> paturls){this.paturls = pathurls; Typefilters = new ArrayList <ItyPefilter>(); paturlfilters = new ArrayList <Ipaturlfilter>(); } / ** * @param subtypefilter * subtypefilter to set * / public void setSubtypefilter(final isubtypefilter subtypefilter){this.subtypefilter = subtypefilter; } / ** * @return subtypefilter * / public isubtypefilter getsubtypefilter(){return subtypefilter; } public Reflections addpaturlfilter(final ipaturlfilter pathurlfilter){if(null == pathurlfilter)これを返します。 if(!this.paturlfilters.contains(paturlfilter))this.paturlfilters.add(paturlfilter);これを返します。 } public Reflections adtypefilter(final itypefilter typefilter){if(null == typefilter)これを返します。 if(!this.typefilters.contains(typefilter))this.typefilters.add(optfilter);これを返します。 } private static final string histfile = "./configuration.ref";私的文書の歴史。 public collection <string> getSubtypesfast(最終クラス<?> BaseType){//、final String ... typenames //最初にフィルタリングが現在最終stringbuilder bufpathsid = new StringBuilder(32);最終マップ<ファイル、url> fileurls = new linkedhashmap <file、url>(8); for(final url pathurl:pathurls){if(!acceptaturl(pathurl))継続;ファイルファイル= null; try {file = new file(urldecoder.decode(paturl.getfile()、 "utf-8")); } catch(最終例外e){file = new file(pathurl.getFile()); } fileurls.put(file、pathurl); if(!file.exists())//はurl file?agnore ingres ovening; bufpathsid.append(file.getName())。append(file.lastModified()); }最終文字列domid = md5.gethashstring(bufpathsid.tostring()); if(null == histdom)hisdom = w3cutils.readxml(histfile); if(null == histdom)hisdom = w3cutils.newdom( "r");要素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); } final String BaseTypeID = md5.gethashstring(BaseType.getName());要素refle = w3cutils.firstchildelement(rootele、 "e"、 "id"、baseTypeid); if(null!= reflee){final list <lement> valueEles = w3cutils.childelementlist(refle、 "f");最終的なコレクション<String> result = new ArrayList <String>(valueEles.size()); for(final element valueele:valueEles){result.add(new String(base64.Decodefast(valueEle.getAttribute( "id")))); } return result; } final threadpool <listsubtypes> pool = new threadpool <listsubtypes>(); for(final filekey:fileurls.keyset()){pool.execute(new listsubtypes(basetype、filekey、fileurls.get(filekey))); } try {pool.shutdown(3、timeunit.minutes); } catch(final interruptedexception e){e.printstacktrace(); // for debug} final collection <string> result = new arraylist <string>(); for(final listsubtypesタスク:pool.getThreadRunables()){result.Addall(task.Result); } Reflee = w3cutils.addele(rootele、 "e"); Refle.setattribute( "id"、BaseTypeid); for(final string itm:result){w3cutils.addele(reflee、 "f")。setattribute( "id"、base64.encodetostring(itm.getBytes()、false)); } try {w3cutils.writexmldocument(histfile、histdom); } catch(最終例外e){} return result; } / ** * @see {@link refrectutils#createsharedreflections(string ...)} * @see {@link refrectutils#setsharedReflections(reflections(refections)} * @see {@link reflectutils#listsubclass(class)} * @param basetype * / public collection < BaseType、final String ... typenames){// final threadpool <listsubtypes> pool = new SthreadPool <listsubtypes>(); for(final url pathurl:pathurls){if(!acceptaturl(pathurl))継続;ファイルファイル= null; try {file = new file(urldecoder.decode(paturl.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 interruptedexception e){e.printstacktrace(); // for debug} final collection <string> result = new arraylist <string>(); for(final listsubtypesタスク:pool.getThreadRunables()){result.Addall(task.Result); } return result; } class listsubtypes runnable {final file;最終クラス<?> BaseType;最終的なURL Pathurl;最終文字列[] Typenames; public ListSubtypes(最終クラス<? this.file = file; this.paturl = 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、result、typenames); }} / ** * @param Basetype * @param pathurl * @param result * / public void listsubtypesfromdirectory(最終ファイルBasedirectory、最終クラス<? if(null == files)files = new file [] {};文字列clazzpath; final int basedirlen = beadirectory.getabsolutepath()。length() + 1; for(final file file:files){if(file.isdirectory()){listsubtypesfromdirectory(beasedirectory、basetype、pathurl、file、result、typenames); } else {clazzpath = file.getabsolutepath()。substring(basedirlen); clazzPath = clazzPath.Replace( '//'、 '/'); dotypesfilter(BaseType、pathurl、result、clazzpath、typenames); }}} / ** * @param Basetype * @param pathurl * @param result * / public void listsubtypesfromjar(最終クラス<? jarfile jarfile = null; try {if( "file" .equals(paturl.getProtocol()))pathurl = new url( "jar:" + paturl.toexternalform() + "!/"); jarfile =((jarurlconnection)paturl.openconnection())。getJarfile(); } catch(最終例外e){最終文字列filepath = pathurl.getFile(); // win platformの場合if(filepath.indexof( ':')!= -1){if(paturl.getFile()。charat(0)== '/')jarfile = new Jarfile(filepath.substring(1)); } if(null == jarfile)jarfile = new Jarfile(filepath); } final Enumeration <Jarentry> e = jarfile.entries(); Zipentryエントリ; while(e.hasmoreElements()){entry = e.NextElement(); dotypesfilter(BaseType、pathurl、result、entry.getName()、typenames); }} catch(final ioexception ioex){}} private void dotypesfilter(final class <? final int lastdotidx = clazzpath.lastindexof( '。'); if(-1 == lastdotidx)return;最終文字列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; 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 Accepturl(final url pathurl){if(this.paturlfilters.isempty())return true; for(final ipaturlfilter paturlfilter:this.paturlfilters){if(paturlfilter.accept(pathurl))trueを返します。 } falseを返します。 }}
パッケージnet.simple.Reflect; Import java.beans.beans; Import java.io.file; Import java.io.ioexception; Import java.io.unsupportedencodingincection; import.jarurlconnection; import java.net.url; Import java.net.net.net.net.net.net.urldecoder; java.util.collection; Import java.util.collections; import java.util.Enumeration; Import java.util.list; Import java.util.jar.jarentry; Import java.util.jar.jarfile; Import Java.util.zip.zipentry; net.simple.reflt.filter.samplesubinstancefilter; Import net.simple.reflt.filter.typefilter;/** * * @author li yanfei * @email [email protected] * 2016年11月2日3:24:02 PM */パブリックファイナルクラスの最後の弦楽"$ {"; public static final string var_end_flag = "}";プライベート静的反射共有反射。静的最終収集<string> emp_coll = collectionsemptylist(); public static final void createsharedRefrections(final string ... filterexts){final Reflections refs = new Reflections(); refs.addpaturlfilter(new paturlfilter(filterexts)); // refs.addtypefilter(typefilter.default); refs.setsubtypefilter(samplesubinstancefilter.default); refrectutils.setsharedRefrections(refs); } /***この方法は、一般的な共有タイプの循環ツールをバインドするために使用されます。 * @param sharedreflections */ public static final void setsharedRefrections(最終的な反射SharedRefrections){refrectutils.sharedRefrections = sharedReflections; } /***このメソッドを呼び出す前に、まず共有タイプの円周ツールを設定する必要があります。参照:{@link #setsharedRefrections(反射)}、 *この方法により、主に指定されたクラスを実装する方が便利になります。 //コールステージに新しいサブクラスの実装が追加される可能性があるため、毎回再実行する必要があります。製品が公開された場合にのみ、レコードを保存する方法を使用して、スタートアップ速度を向上させます。 Beans.isdesigntime()を返しますか? SharedReflections.getSubtypes(Basetype、Typenames):sharedReflections.getSubtypesFast(BaseType); } public static list <class <?>> listclassofpackage(final class <?最終リスト<文字列> cpath = refrectutils.listclasscanonicalnameofpackage(ctype、endix); 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 Reflectutils.listnameofpackage(clazz、extension、true); } public static list <string> listclassnameofpackage(final class <?> clazz、final string endix){return refrectils.listnameofpackage(clazz、extension、false); } public static list <string> listNameofPackage(最終クラス<? } public static list <string> listnameofpackage(final string clazzpkg、final string endix、final boolean fullpkgname){final list <string> result = new ArrayList <String>(); final stringbuffer pkgbuf = new Stringbuffer(clazzpkg); if(pkgbuf.charat(0)!= '/')pkgbuf.insert(0、 '/'); final url urlpath = refrectutils.class.getResource(pkgbuf.tostring()); if(null == urlpath)return result;文字列checkedextenion = endix; if(!extenion.endswith( "。class"))checkedextenion = endoct + ".class"; if(pkgbuf.toString()。endswith( "。class")))pkgbuf.delete(pkgbuf.lastindexof( "/")、pkgbuf.length()); pkgbuf.deletecharat(0); final stringbuffer fileurl = new StringBuffer(); try {fileurl.append(urldecoder.decode(urlpath.toexternalform()、 "utf-8")); } catch(最終unsupportedencodingexception e1){fileurl.append(urlpath.toexternalform()); } if(fileurl.tostring()。startswith( "file:")){fileurl.delete(0、5); // delete file:flag if(fileurl.indexof( ":")!= -1)fileurl.deletecharat(0); 8); Reflectutils.dolistnameofpackageIndirectory(new file(badedir)、new file(basedir)、result、pkgbuf.tostring()、checkedextenion、fullpkgname); } else {refrectutils.dolistnameofpackageinjar(urlpath、urlpath、result、pkgbuf.tostring()、checkedextenion、fullpkgname); } return result; } / *** / private static void dolistname ofpackageinjar(最終URL baseurl、最終url urlpath、final list <string> result、final string clazzpkg、final string extension、final boolean fullpkgname){try {//ファイルシステムで動作しない:パッケージの場合は、パッケージの場合はパッケージにあります。 final jarurlconnection conn =(jarurlconnection)urlpath.openconnection(); final jarfile jfile = conn.getjarfile();最終列挙<Jarentry> e = jfile.entries(); Zipentryエントリ;文字列エントリ名; while(e.hasmoreElements()){entry = e.NextElement(); EntryName = entry.getName(); if(entryname.startswith(clazzpkg)&& entryname.endswith(extenion)){if(fullpkgname)result.add(entryname.substring(0、entryname.lastindexof( '。'))。 else result.add(entryname.substring(entryname.lastindexof( '/') + 1、entryname.lastindexof( '。'))); }}} catch(final ioexception ioex){}} private static void dolistnameofpackageIndirectory(final file basedirectory、final file directory、final list <string> result、clazzpkg、最終文字列拡張機能、最終的なboolean fullpkgname){file [] files = file.listfiles(); if(null == files)files = new file [] {};文字列clazzpath; final int basedirlen = beadirectory.getabsolutepath()。length() + 1; for(final file:files){if(file.isdirectory()){respremutils.dolistnameofpackageIndirectory(beasedirectory、file、result、clazzpkg、endix、fullpkgname); } else {if(!file.getName()。endswith(extenion))継続; if(fullpkgname){clazzpath = file.getabsolutepath()。substring(basedirlen); clazzpath = clazzpath.substring(0、clazzpath.length()-6); result.add(clazzpath.replace(file.separatorchar、 '。')); } else {result.add(file.getName()。substring(0、file.getName()。length() - 6)); }}}} public static final <t> t initclass(final string inplclass、final class <t> ttype){refrument refrectutils.initclass(inplclass、ttype、true); } public static final <t> t initclass(最終文字列inflclass、最終クラス<t> ttype、final boolean doinit){try {final object = class.forname(inplclass、doinit、swreat.currentthread()。getContextClassLoader()。 ttype.cast(object)を返します。 } catch(final throwable e){return null; }}}
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。